OSDN Git Service

svnプロパティをファイルの種類に応じたものに更新
authorhoneplus <honeplus@users.osdn.me>
Mon, 30 Jan 2012 14:52:13 +0000 (14:52 +0000)
committerhoneplus <honeplus@users.osdn.me>
Mon, 30 Jan 2012 14:52:13 +0000 (14:52 +0000)
git-svn-id: http://svn.osdn.net/svnroot/wptscs/trunk@3 7cc79d57-4d93-40a1-83d5-ec7b38613dec

59 files changed:
Wikipedia 翻訳支援ツール.sln
Wptscs/ConfigForm.Designer.cs
Wptscs/ConfigForm.cs
Wptscs/ConfigForm.resx
Wptscs/License.txt
Wptscs/Logics/MediaWikiTranslator.cs
Wptscs/Logics/Translator.cs
Wptscs/MainForm.Designer.cs
Wptscs/MainForm.cs
Wptscs/MainForm.resx
Wptscs/Models/Config.cs
Wptscs/Models/IgnoreCaseDictionary.cs
Wptscs/Models/Language.cs
Wptscs/Models/MediaWiki.cs
Wptscs/Models/MediaWikiPage.cs
Wptscs/Models/Page.cs
Wptscs/Models/TranslationDictionary.cs
Wptscs/Models/TranslationTable.cs
Wptscs/Models/Website.cs
Wptscs/Program.cs
Wptscs/Properties/AssemblyInfo.cs
Wptscs/Properties/Resources.Designer.cs
Wptscs/Properties/Resources.resx
Wptscs/Properties/Settings.Designer.cs
Wptscs/Properties/Settings.settings
Wptscs/Readme.txt
Wptscs/Settings.cs
Wptscs/Utilities/FormUtils.cs
Wptscs/Utilities/LazyXmlParser.cs
Wptscs/Utilities/ObjectUtils.cs
Wptscs/Utilities/StringUtils.cs
Wptscs/Utilities/Validate.cs
Wptscs/Utilities/XmlUtils.cs
Wptscs/Wptscs.csproj
Wptscs/app.config
Wptscs/config.xml
WptscsTest/Data/MediaWiki/en/_api.xml
WptscsTest/Data/MediaWiki/ja/_api.xml
WptscsTest/Data/config.xml
WptscsTest/Logics/MediaWikiTranslatorTest.cs
WptscsTest/Models/ConfigTest.cs
WptscsTest/Models/IgnoreCaseDictionaryTest.cs
WptscsTest/Models/LanguageTest.cs
WptscsTest/Models/MediaWikiPageTest.cs
WptscsTest/Models/MediaWikiTest.cs
WptscsTest/Models/PageTest.cs
WptscsTest/Models/TestingConfig.cs
WptscsTest/Models/TranslationDictionaryTest.cs
WptscsTest/Models/TranslationTableTest.cs
WptscsTest/Models/WebsiteTest.cs
WptscsTest/PrivateAccessor.cs
WptscsTest/Properties/AssemblyInfo.cs
WptscsTest/Utilities/FormUtilsTest.cs
WptscsTest/Utilities/LazyXmlParserTest.cs
WptscsTest/Utilities/ObjectUtilsTest.cs
WptscsTest/Utilities/StringUtilsTest.cs
WptscsTest/Utilities/ValidateTest.cs
WptscsTest/Utilities/XmlUtilsTest.cs
WptscsTest/WptscsTest.csproj

index 5e86b71..1ce842b 100644 (file)
@@ -1,36 +1,36 @@
-\r
-Microsoft Visual Studio Solution File, Format Version 11.00\r
-# Visual C# Express 2010\r
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wptscs", "wptscs\Wptscs.csproj", "{4E20E523-0230-474C-B8F1-1E991360F5F5}"\r
-EndProject\r
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WptscsTest", "WptscsTest\WptscsTest.csproj", "{FDBDFBB8-2975-4521-87C6-D75CF9144DED}"\r
-EndProject\r
-Global\r
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
-               Debug|Any CPU = Debug|Any CPU\r
-               Debug|x86 = Debug|x86\r
-               Release|Any CPU = Release|Any CPU\r
-               Release|x86 = Release|x86\r
-       EndGlobalSection\r
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|x86.ActiveCfg = Debug|Any CPU\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|Any CPU.Build.0 = Release|Any CPU\r
-               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|x86.ActiveCfg = Release|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|x86.ActiveCfg = Debug|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|Any CPU.Build.0 = Release|Any CPU\r
-               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|x86.ActiveCfg = Release|Any CPU\r
-       EndGlobalSection\r
-       GlobalSection(SolutionProperties) = preSolution\r
-               HideSolutionNode = FALSE\r
-       EndGlobalSection\r
-       GlobalSection(SubversionScc) = preSolution\r
-               Svn-Managed = True\r
-               Manager = AnkhSVN - Subversion Support for Visual Studio\r
-       EndGlobalSection\r
-EndGlobal\r
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C# Express 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wptscs", "wptscs\Wptscs.csproj", "{4E20E523-0230-474C-B8F1-1E991360F5F5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WptscsTest", "WptscsTest\WptscsTest.csproj", "{FDBDFBB8-2975-4521-87C6-D75CF9144DED}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Any CPU = Debug|Any CPU
+               Debug|x86 = Debug|x86
+               Release|Any CPU = Release|Any CPU
+               Release|x86 = Release|x86
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|Any CPU.Build.0 = Release|Any CPU
+               {4E20E523-0230-474C-B8F1-1E991360F5F5}.Release|x86.ActiveCfg = Release|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|Any CPU.Build.0 = Release|Any CPU
+               {FDBDFBB8-2975-4521-87C6-D75CF9144DED}.Release|x86.ActiveCfg = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+       GlobalSection(SubversionScc) = preSolution
+               Svn-Managed = True
+               Manager = AnkhSVN - Subversion Support for Visual Studio
+       EndGlobalSection
+EndGlobal
index 2d3cd3b..f31290a 100644 (file)
-namespace Honememo.Wptscs\r
-{\r
-    partial class ConfigForm\r
-    {\r
-        /// <summary>\r
-        /// 必要なデザイナ変数です。\r
-        /// </summary>\r
-        private System.ComponentModel.IContainer components = null;\r
-\r
-        /// <summary>\r
-        /// 使用中のリソースをすべてクリーンアップします。\r
-        /// </summary>\r
-        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>\r
-        protected override void Dispose(bool disposing)\r
-        {\r
-            if (disposing && (components != null))\r
-            {\r
-                components.Dispose();\r
-            }\r
-            base.Dispose(disposing);\r
-        }\r
-\r
-        #region Windows フォーム デザイナで生成されたコード\r
-\r
-        /// <summary>\r
-        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を\r
-        /// コード エディタで変更しないでください。\r
-        /// </summary>\r
-        private void InitializeComponent()\r
-        {\r
-            this.components = new System.ComponentModel.Container();\r
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigForm));\r
-            this.buttonOk = new System.Windows.Forms.Button();\r
-            this.buttonCancel = new System.Windows.Forms.Button();\r
-            this.tabControl = new System.Windows.Forms.TabControl();\r
-            this.tabPageItems = new System.Windows.Forms.TabPage();\r
-            this.dataGridViewItems = new System.Windows.Forms.DataGridView();\r
-            this.tabPageHeadings = new System.Windows.Forms.TabPage();\r
-            this.dataGridViewHeading = new System.Windows.Forms.DataGridView();\r
-            this.tabPageServer = new System.Windows.Forms.TabPage();\r
-            this.groupBoxLanguage = new System.Windows.Forms.GroupBox();\r
-            this.groupBoxLanguageName = new System.Windows.Forms.GroupBox();\r
-            this.dataGridViewLanguageName = new System.Windows.Forms.DataGridView();\r
-            this.ColumnCode = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnName = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnShortName = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.textBoxBracket = new System.Windows.Forms.TextBox();\r
-            this.labelBracket = new System.Windows.Forms.Label();\r
-            this.groupBoxServer = new System.Windows.Forms.GroupBox();\r
-            this.textBoxDocumentationTemplateDefaultPage = new System.Windows.Forms.TextBox();\r
-            this.labelDocumentationTemplateDefaultPage = new System.Windows.Forms.Label();\r
-            this.textBoxDocumentationTemplate = new System.Windows.Forms.TextBox();\r
-            this.labelDocumentationTemplate = new System.Windows.Forms.Label();\r
-            this.textBoxFileNamespace = new System.Windows.Forms.TextBox();\r
-            this.labelFileNamespace = new System.Windows.Forms.Label();\r
-            this.textBoxCategoryNamespace = new System.Windows.Forms.TextBox();\r
-            this.labelCategoryNamespace = new System.Windows.Forms.Label();\r
-            this.textBoxTemplateNamespace = new System.Windows.Forms.TextBox();\r
-            this.labelTemplateNamespace = new System.Windows.Forms.Label();\r
-            this.textBoxRedirect = new System.Windows.Forms.TextBox();\r
-            this.labelRedirect = new System.Windows.Forms.Label();\r
-            this.textBoxExportPath = new System.Windows.Forms.TextBox();\r
-            this.labelExportPath = new System.Windows.Forms.Label();\r
-            this.textBoxNamespacePath = new System.Windows.Forms.TextBox();\r
-            this.labelNamespacePath = new System.Windows.Forms.Label();\r
-            this.textBoxLocation = new System.Windows.Forms.TextBox();\r
-            this.labelLocation = new System.Windows.Forms.Label();\r
-            this.comboBoxLanguage = new System.Windows.Forms.ComboBox();\r
-            this.labelLanguage = new System.Windows.Forms.Label();\r
-            this.tabPageApplication = new System.Windows.Forms.TabPage();\r
-            this.groupBoxInformation = new System.Windows.Forms.GroupBox();\r
-            this.labelWebsite = new System.Windows.Forms.Label();\r
-            this.linkLabelWebsite = new System.Windows.Forms.LinkLabel();\r
-            this.labelCopyright = new System.Windows.Forms.Label();\r
-            this.labelApplicationName = new System.Windows.Forms.Label();\r
-            this.groupBoxApplicationConfig = new System.Windows.Forms.GroupBox();\r
-            this.checkBoxIgnoreError = new System.Windows.Forms.CheckBox();\r
-            this.labelRefererNote = new System.Windows.Forms.Label();\r
-            this.labelUserAgentNote = new System.Windows.Forms.Label();\r
-            this.labelChaceNote = new System.Windows.Forms.Label();\r
-            this.textBoxCacheExpire = new System.Windows.Forms.TextBox();\r
-            this.textBoxReferer = new System.Windows.Forms.TextBox();\r
-            this.labelReferer = new System.Windows.Forms.Label();\r
-            this.labelCacheExpire = new System.Windows.Forms.Label();\r
-            this.textBoxUserAgent = new System.Windows.Forms.TextBox();\r
-            this.labelUserAgent = new System.Windows.Forms.Label();\r
-            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);\r
-            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\r
-            this.ColumnFromCode = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnFromTitle = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnAlias = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnArrow = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnToCode = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnToTitle = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.ColumnTimestamp = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
-            this.tabControl.SuspendLayout();\r
-            this.tabPageItems.SuspendLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewItems)).BeginInit();\r
-            this.tabPageHeadings.SuspendLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHeading)).BeginInit();\r
-            this.tabPageServer.SuspendLayout();\r
-            this.groupBoxLanguage.SuspendLayout();\r
-            this.groupBoxLanguageName.SuspendLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewLanguageName)).BeginInit();\r
-            this.groupBoxServer.SuspendLayout();\r
-            this.tabPageApplication.SuspendLayout();\r
-            this.groupBoxInformation.SuspendLayout();\r
-            this.groupBoxApplicationConfig.SuspendLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();\r
-            this.SuspendLayout();\r
-            // \r
-            // buttonOk\r
-            // \r
-            resources.ApplyResources(this.buttonOk, "buttonOk");\r
-            this.buttonOk.Name = "buttonOk";\r
-            this.buttonOk.UseVisualStyleBackColor = true;\r
-            this.buttonOk.Click += new System.EventHandler(this.ButtonOk_Click);\r
-            // \r
-            // buttonCancel\r
-            // \r
-            resources.ApplyResources(this.buttonCancel, "buttonCancel");\r
-            this.buttonCancel.CausesValidation = false;\r
-            this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r
-            this.buttonCancel.Name = "buttonCancel";\r
-            this.buttonCancel.UseVisualStyleBackColor = true;\r
-            // \r
-            // tabControl\r
-            // \r
-            resources.ApplyResources(this.tabControl, "tabControl");\r
-            this.tabControl.Controls.Add(this.tabPageItems);\r
-            this.tabControl.Controls.Add(this.tabPageHeadings);\r
-            this.tabControl.Controls.Add(this.tabPageServer);\r
-            this.tabControl.Controls.Add(this.tabPageApplication);\r
-            this.tabControl.Name = "tabControl";\r
-            this.tabControl.SelectedIndex = 0;\r
-            this.toolTip.SetToolTip(this.tabControl, resources.GetString("tabControl.ToolTip"));\r
-            // \r
-            // tabPageItems\r
-            // \r
-            this.tabPageItems.Controls.Add(this.dataGridViewItems);\r
-            resources.ApplyResources(this.tabPageItems, "tabPageItems");\r
-            this.tabPageItems.Name = "tabPageItems";\r
-            this.tabPageItems.UseVisualStyleBackColor = true;\r
-            // \r
-            // dataGridViewItems\r
-            // \r
-            resources.ApplyResources(this.dataGridViewItems, "dataGridViewItems");\r
-            this.dataGridViewItems.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\r
-            this.dataGridViewItems.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\r
-            this.ColumnFromCode,\r
-            this.ColumnFromTitle,\r
-            this.ColumnAlias,\r
-            this.ColumnArrow,\r
-            this.ColumnToCode,\r
-            this.ColumnToTitle,\r
-            this.ColumnTimestamp});\r
-            this.dataGridViewItems.Name = "dataGridViewItems";\r
-            this.dataGridViewItems.RowTemplate.Height = 21;\r
-            this.dataGridViewItems.CellValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridViewItems_CellValidated);\r
-            this.dataGridViewItems.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.DataGridViewItems_CellValidating);\r
-            this.dataGridViewItems.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridViewItems_CellValueChanged);\r
-            this.dataGridViewItems.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(this.DataGridViewItems_RowsAdded);\r
-            this.dataGridViewItems.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResetErrorText_RowValidated);\r
-            this.dataGridViewItems.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.DataGridViewItems_RowValidating);\r
-            // \r
-            // tabPageHeadings\r
-            // \r
-            this.tabPageHeadings.Controls.Add(this.dataGridViewHeading);\r
-            resources.ApplyResources(this.tabPageHeadings, "tabPageHeadings");\r
-            this.tabPageHeadings.Name = "tabPageHeadings";\r
-            this.tabPageHeadings.UseVisualStyleBackColor = true;\r
-            // \r
-            // dataGridViewHeading\r
-            // \r
-            resources.ApplyResources(this.dataGridViewHeading, "dataGridViewHeading");\r
-            this.dataGridViewHeading.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\r
-            this.dataGridViewHeading.Name = "dataGridViewHeading";\r
-            this.dataGridViewHeading.RowTemplate.Height = 21;\r
-            // \r
-            // tabPageServer\r
-            // \r
-            this.tabPageServer.Controls.Add(this.groupBoxLanguage);\r
-            this.tabPageServer.Controls.Add(this.groupBoxServer);\r
-            this.tabPageServer.Controls.Add(this.comboBoxLanguage);\r
-            this.tabPageServer.Controls.Add(this.labelLanguage);\r
-            resources.ApplyResources(this.tabPageServer, "tabPageServer");\r
-            this.tabPageServer.Name = "tabPageServer";\r
-            this.tabPageServer.UseVisualStyleBackColor = true;\r
-            // \r
-            // groupBoxLanguage\r
-            // \r
-            resources.ApplyResources(this.groupBoxLanguage, "groupBoxLanguage");\r
-            this.groupBoxLanguage.Controls.Add(this.groupBoxLanguageName);\r
-            this.groupBoxLanguage.Controls.Add(this.textBoxBracket);\r
-            this.groupBoxLanguage.Controls.Add(this.labelBracket);\r
-            this.groupBoxLanguage.Name = "groupBoxLanguage";\r
-            this.groupBoxLanguage.TabStop = false;\r
-            // \r
-            // groupBoxLanguageName\r
-            // \r
-            resources.ApplyResources(this.groupBoxLanguageName, "groupBoxLanguageName");\r
-            this.groupBoxLanguageName.Controls.Add(this.dataGridViewLanguageName);\r
-            this.groupBoxLanguageName.Name = "groupBoxLanguageName";\r
-            this.groupBoxLanguageName.TabStop = false;\r
-            this.toolTip.SetToolTip(this.groupBoxLanguageName, resources.GetString("groupBoxLanguageName.ToolTip"));\r
-            // \r
-            // dataGridViewLanguageName\r
-            // \r
-            resources.ApplyResources(this.dataGridViewLanguageName, "dataGridViewLanguageName");\r
-            this.dataGridViewLanguageName.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\r
-            this.dataGridViewLanguageName.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\r
-            this.ColumnCode,\r
-            this.ColumnName,\r
-            this.ColumnShortName});\r
-            this.dataGridViewLanguageName.Name = "dataGridViewLanguageName";\r
-            this.dataGridViewLanguageName.RowTemplate.Height = 21;\r
-            this.dataGridViewLanguageName.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResetErrorText_RowValidated);\r
-            this.dataGridViewLanguageName.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.DataGridViewLanguageName_RowValidating);\r
-            this.dataGridViewLanguageName.Validating += new System.ComponentModel.CancelEventHandler(this.DataGridViewLanguageName_Validating);\r
-            this.dataGridViewLanguageName.Validated += new System.EventHandler(this.ResetErrorText_Validated);\r
-            // \r
-            // ColumnCode\r
-            // \r
-            this.ColumnCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;\r
-            resources.ApplyResources(this.ColumnCode, "ColumnCode");\r
-            this.ColumnCode.MaxInputLength = 10;\r
-            this.ColumnCode.Name = "ColumnCode";\r
-            // \r
-            // ColumnName\r
-            // \r
-            this.ColumnName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;\r
-            resources.ApplyResources(this.ColumnName, "ColumnName");\r
-            this.ColumnName.MaxInputLength = 255;\r
-            this.ColumnName.Name = "ColumnName";\r
-            // \r
-            // ColumnShortName\r
-            // \r
-            this.ColumnShortName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;\r
-            resources.ApplyResources(this.ColumnShortName, "ColumnShortName");\r
-            this.ColumnShortName.MaxInputLength = 20;\r
-            this.ColumnShortName.Name = "ColumnShortName";\r
-            // \r
-            // textBoxBracket\r
-            // \r
-            resources.ApplyResources(this.textBoxBracket, "textBoxBracket");\r
-            this.textBoxBracket.Name = "textBoxBracket";\r
-            this.toolTip.SetToolTip(this.textBoxBracket, resources.GetString("textBoxBracket.ToolTip"));\r
-            // \r
-            // labelBracket\r
-            // \r
-            resources.ApplyResources(this.labelBracket, "labelBracket");\r
-            this.labelBracket.Name = "labelBracket";\r
-            this.toolTip.SetToolTip(this.labelBracket, resources.GetString("labelBracket.ToolTip"));\r
-            // \r
-            // groupBoxServer\r
-            // \r
-            resources.ApplyResources(this.groupBoxServer, "groupBoxServer");\r
-            this.groupBoxServer.Controls.Add(this.textBoxDocumentationTemplateDefaultPage);\r
-            this.groupBoxServer.Controls.Add(this.labelDocumentationTemplateDefaultPage);\r
-            this.groupBoxServer.Controls.Add(this.textBoxDocumentationTemplate);\r
-            this.groupBoxServer.Controls.Add(this.labelDocumentationTemplate);\r
-            this.groupBoxServer.Controls.Add(this.textBoxFileNamespace);\r
-            this.groupBoxServer.Controls.Add(this.labelFileNamespace);\r
-            this.groupBoxServer.Controls.Add(this.textBoxCategoryNamespace);\r
-            this.groupBoxServer.Controls.Add(this.labelCategoryNamespace);\r
-            this.groupBoxServer.Controls.Add(this.textBoxTemplateNamespace);\r
-            this.groupBoxServer.Controls.Add(this.labelTemplateNamespace);\r
-            this.groupBoxServer.Controls.Add(this.textBoxRedirect);\r
-            this.groupBoxServer.Controls.Add(this.labelRedirect);\r
-            this.groupBoxServer.Controls.Add(this.textBoxExportPath);\r
-            this.groupBoxServer.Controls.Add(this.labelExportPath);\r
-            this.groupBoxServer.Controls.Add(this.textBoxNamespacePath);\r
-            this.groupBoxServer.Controls.Add(this.labelNamespacePath);\r
-            this.groupBoxServer.Controls.Add(this.textBoxLocation);\r
-            this.groupBoxServer.Controls.Add(this.labelLocation);\r
-            this.groupBoxServer.Name = "groupBoxServer";\r
-            this.groupBoxServer.TabStop = false;\r
-            // \r
-            // textBoxDocumentationTemplateDefaultPage\r
-            // \r
-            resources.ApplyResources(this.textBoxDocumentationTemplateDefaultPage, "textBoxDocumentationTemplateDefaultPage");\r
-            this.textBoxDocumentationTemplateDefaultPage.Name = "textBoxDocumentationTemplateDefaultPage";\r
-            this.toolTip.SetToolTip(this.textBoxDocumentationTemplateDefaultPage, resources.GetString("textBoxDocumentationTemplateDefaultPage.ToolTip"));\r
-            // \r
-            // labelDocumentationTemplateDefaultPage\r
-            // \r
-            resources.ApplyResources(this.labelDocumentationTemplateDefaultPage, "labelDocumentationTemplateDefaultPage");\r
-            this.labelDocumentationTemplateDefaultPage.Name = "labelDocumentationTemplateDefaultPage";\r
-            this.toolTip.SetToolTip(this.labelDocumentationTemplateDefaultPage, resources.GetString("labelDocumentationTemplateDefaultPage.ToolTip"));\r
-            // \r
-            // textBoxDocumentationTemplate\r
-            // \r
-            resources.ApplyResources(this.textBoxDocumentationTemplate, "textBoxDocumentationTemplate");\r
-            this.textBoxDocumentationTemplate.Name = "textBoxDocumentationTemplate";\r
-            this.toolTip.SetToolTip(this.textBoxDocumentationTemplate, resources.GetString("textBoxDocumentationTemplate.ToolTip"));\r
-            // \r
-            // labelDocumentationTemplate\r
-            // \r
-            resources.ApplyResources(this.labelDocumentationTemplate, "labelDocumentationTemplate");\r
-            this.labelDocumentationTemplate.Name = "labelDocumentationTemplate";\r
-            this.toolTip.SetToolTip(this.labelDocumentationTemplate, resources.GetString("labelDocumentationTemplate.ToolTip"));\r
-            // \r
-            // textBoxFileNamespace\r
-            // \r
-            resources.ApplyResources(this.textBoxFileNamespace, "textBoxFileNamespace");\r
-            this.textBoxFileNamespace.Name = "textBoxFileNamespace";\r
-            this.toolTip.SetToolTip(this.textBoxFileNamespace, resources.GetString("textBoxFileNamespace.ToolTip"));\r
-            this.textBoxFileNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);\r
-            this.textBoxFileNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);\r
-            // \r
-            // labelFileNamespace\r
-            // \r
-            resources.ApplyResources(this.labelFileNamespace, "labelFileNamespace");\r
-            this.labelFileNamespace.Name = "labelFileNamespace";\r
-            this.toolTip.SetToolTip(this.labelFileNamespace, resources.GetString("labelFileNamespace.ToolTip"));\r
-            // \r
-            // textBoxCategoryNamespace\r
-            // \r
-            resources.ApplyResources(this.textBoxCategoryNamespace, "textBoxCategoryNamespace");\r
-            this.textBoxCategoryNamespace.Name = "textBoxCategoryNamespace";\r
-            this.toolTip.SetToolTip(this.textBoxCategoryNamespace, resources.GetString("textBoxCategoryNamespace.ToolTip"));\r
-            this.textBoxCategoryNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);\r
-            this.textBoxCategoryNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);\r
-            // \r
-            // labelCategoryNamespace\r
-            // \r
-            resources.ApplyResources(this.labelCategoryNamespace, "labelCategoryNamespace");\r
-            this.labelCategoryNamespace.Name = "labelCategoryNamespace";\r
-            this.toolTip.SetToolTip(this.labelCategoryNamespace, resources.GetString("labelCategoryNamespace.ToolTip"));\r
-            // \r
-            // textBoxTemplateNamespace\r
-            // \r
-            resources.ApplyResources(this.textBoxTemplateNamespace, "textBoxTemplateNamespace");\r
-            this.textBoxTemplateNamespace.Name = "textBoxTemplateNamespace";\r
-            this.toolTip.SetToolTip(this.textBoxTemplateNamespace, resources.GetString("textBoxTemplateNamespace.ToolTip"));\r
-            this.textBoxTemplateNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);\r
-            this.textBoxTemplateNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);\r
-            // \r
-            // labelTemplateNamespace\r
-            // \r
-            resources.ApplyResources(this.labelTemplateNamespace, "labelTemplateNamespace");\r
-            this.labelTemplateNamespace.Name = "labelTemplateNamespace";\r
-            this.toolTip.SetToolTip(this.labelTemplateNamespace, resources.GetString("labelTemplateNamespace.ToolTip"));\r
-            // \r
-            // textBoxRedirect\r
-            // \r
-            resources.ApplyResources(this.textBoxRedirect, "textBoxRedirect");\r
-            this.textBoxRedirect.Name = "textBoxRedirect";\r
-            this.toolTip.SetToolTip(this.textBoxRedirect, resources.GetString("textBoxRedirect.ToolTip"));\r
-            // \r
-            // labelRedirect\r
-            // \r
-            resources.ApplyResources(this.labelRedirect, "labelRedirect");\r
-            this.labelRedirect.Name = "labelRedirect";\r
-            this.toolTip.SetToolTip(this.labelRedirect, resources.GetString("labelRedirect.ToolTip"));\r
-            // \r
-            // textBoxExportPath\r
-            // \r
-            resources.ApplyResources(this.textBoxExportPath, "textBoxExportPath");\r
-            this.textBoxExportPath.Name = "textBoxExportPath";\r
-            this.toolTip.SetToolTip(this.textBoxExportPath, resources.GetString("textBoxExportPath.ToolTip"));\r
-            // \r
-            // labelExportPath\r
-            // \r
-            resources.ApplyResources(this.labelExportPath, "labelExportPath");\r
-            this.labelExportPath.Name = "labelExportPath";\r
-            this.toolTip.SetToolTip(this.labelExportPath, resources.GetString("labelExportPath.ToolTip"));\r
-            // \r
-            // textBoxNamespacePath\r
-            // \r
-            resources.ApplyResources(this.textBoxNamespacePath, "textBoxNamespacePath");\r
-            this.textBoxNamespacePath.Name = "textBoxNamespacePath";\r
-            this.toolTip.SetToolTip(this.textBoxNamespacePath, resources.GetString("textBoxNamespacePath.ToolTip"));\r
-            // \r
-            // labelNamespacePath\r
-            // \r
-            resources.ApplyResources(this.labelNamespacePath, "labelNamespacePath");\r
-            this.labelNamespacePath.Name = "labelNamespacePath";\r
-            this.toolTip.SetToolTip(this.labelNamespacePath, resources.GetString("labelNamespacePath.ToolTip"));\r
-            // \r
-            // textBoxLocation\r
-            // \r
-            resources.ApplyResources(this.textBoxLocation, "textBoxLocation");\r
-            this.textBoxLocation.Name = "textBoxLocation";\r
-            this.toolTip.SetToolTip(this.textBoxLocation, resources.GetString("textBoxLocation.ToolTip"));\r
-            // \r
-            // labelLocation\r
-            // \r
-            resources.ApplyResources(this.labelLocation, "labelLocation");\r
-            this.labelLocation.Name = "labelLocation";\r
-            this.toolTip.SetToolTip(this.labelLocation, resources.GetString("labelLocation.ToolTip"));\r
-            // \r
-            // comboBoxLanguage\r
-            // \r
-            this.comboBoxLanguage.FormattingEnabled = true;\r
-            resources.ApplyResources(this.comboBoxLanguage, "comboBoxLanguage");\r
-            this.comboBoxLanguage.Name = "comboBoxLanguage";\r
-            this.toolTip.SetToolTip(this.comboBoxLanguage, resources.GetString("comboBoxLanguage.ToolTip"));\r
-            this.comboBoxLanguage.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLanguuage_SelectedIndexChanged);\r
-            this.comboBoxLanguage.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ComboBoxLanguage_KeyDown);\r
-            this.comboBoxLanguage.Leave += new System.EventHandler(this.ComboBoxLanguage_Leave);\r
-            // \r
-            // labelLanguage\r
-            // \r
-            resources.ApplyResources(this.labelLanguage, "labelLanguage");\r
-            this.labelLanguage.Name = "labelLanguage";\r
-            this.toolTip.SetToolTip(this.labelLanguage, resources.GetString("labelLanguage.ToolTip"));\r
-            // \r
-            // tabPageApplication\r
-            // \r
-            this.tabPageApplication.Controls.Add(this.groupBoxInformation);\r
-            this.tabPageApplication.Controls.Add(this.groupBoxApplicationConfig);\r
-            resources.ApplyResources(this.tabPageApplication, "tabPageApplication");\r
-            this.tabPageApplication.Name = "tabPageApplication";\r
-            this.tabPageApplication.UseVisualStyleBackColor = true;\r
-            // \r
-            // groupBoxInformation\r
-            // \r
-            resources.ApplyResources(this.groupBoxInformation, "groupBoxInformation");\r
-            this.groupBoxInformation.Controls.Add(this.labelWebsite);\r
-            this.groupBoxInformation.Controls.Add(this.linkLabelWebsite);\r
-            this.groupBoxInformation.Controls.Add(this.labelCopyright);\r
-            this.groupBoxInformation.Controls.Add(this.labelApplicationName);\r
-            this.groupBoxInformation.Name = "groupBoxInformation";\r
-            this.groupBoxInformation.TabStop = false;\r
-            // \r
-            // labelWebsite\r
-            // \r
-            resources.ApplyResources(this.labelWebsite, "labelWebsite");\r
-            this.labelWebsite.Name = "labelWebsite";\r
-            // \r
-            // linkLabelWebsite\r
-            // \r
-            resources.ApplyResources(this.linkLabelWebsite, "linkLabelWebsite");\r
-            this.linkLabelWebsite.Name = "linkLabelWebsite";\r
-            this.linkLabelWebsite.TabStop = true;\r
-            this.linkLabelWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelWebsite_LinkClicked);\r
-            // \r
-            // labelCopyright\r
-            // \r
-            resources.ApplyResources(this.labelCopyright, "labelCopyright");\r
-            this.labelCopyright.Name = "labelCopyright";\r
-            // \r
-            // labelApplicationName\r
-            // \r
-            resources.ApplyResources(this.labelApplicationName, "labelApplicationName");\r
-            this.labelApplicationName.Name = "labelApplicationName";\r
-            // \r
-            // groupBoxApplicationConfig\r
-            // \r
-            resources.ApplyResources(this.groupBoxApplicationConfig, "groupBoxApplicationConfig");\r
-            this.groupBoxApplicationConfig.Controls.Add(this.checkBoxIgnoreError);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelRefererNote);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelUserAgentNote);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelChaceNote);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.textBoxCacheExpire);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.textBoxReferer);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelReferer);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelCacheExpire);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.textBoxUserAgent);\r
-            this.groupBoxApplicationConfig.Controls.Add(this.labelUserAgent);\r
-            this.groupBoxApplicationConfig.Name = "groupBoxApplicationConfig";\r
-            this.groupBoxApplicationConfig.TabStop = false;\r
-            // \r
-            // checkBoxIgnoreError\r
-            // \r
-            resources.ApplyResources(this.checkBoxIgnoreError, "checkBoxIgnoreError");\r
-            this.checkBoxIgnoreError.Name = "checkBoxIgnoreError";\r
-            this.toolTip.SetToolTip(this.checkBoxIgnoreError, resources.GetString("checkBoxIgnoreError.ToolTip"));\r
-            this.checkBoxIgnoreError.UseVisualStyleBackColor = true;\r
-            // \r
-            // labelRefererNote\r
-            // \r
-            resources.ApplyResources(this.labelRefererNote, "labelRefererNote");\r
-            this.labelRefererNote.Name = "labelRefererNote";\r
-            // \r
-            // labelUserAgentNote\r
-            // \r
-            resources.ApplyResources(this.labelUserAgentNote, "labelUserAgentNote");\r
-            this.labelUserAgentNote.Name = "labelUserAgentNote";\r
-            // \r
-            // labelChaceNote\r
-            // \r
-            resources.ApplyResources(this.labelChaceNote, "labelChaceNote");\r
-            this.labelChaceNote.Name = "labelChaceNote";\r
-            // \r
-            // textBoxCacheExpire\r
-            // \r
-            resources.ApplyResources(this.textBoxCacheExpire, "textBoxCacheExpire");\r
-            this.textBoxCacheExpire.Name = "textBoxCacheExpire";\r
-            this.toolTip.SetToolTip(this.textBoxCacheExpire, resources.GetString("textBoxCacheExpire.ToolTip"));\r
-            this.textBoxCacheExpire.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxCacheExpire_Validating);\r
-            this.textBoxCacheExpire.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);\r
-            // \r
-            // textBoxReferer\r
-            // \r
-            resources.ApplyResources(this.textBoxReferer, "textBoxReferer");\r
-            this.textBoxReferer.Name = "textBoxReferer";\r
-            this.toolTip.SetToolTip(this.textBoxReferer, resources.GetString("textBoxReferer.ToolTip"));\r
-            // \r
-            // labelReferer\r
-            // \r
-            resources.ApplyResources(this.labelReferer, "labelReferer");\r
-            this.labelReferer.Name = "labelReferer";\r
-            this.toolTip.SetToolTip(this.labelReferer, resources.GetString("labelReferer.ToolTip"));\r
-            // \r
-            // labelCacheExpire\r
-            // \r
-            resources.ApplyResources(this.labelCacheExpire, "labelCacheExpire");\r
-            this.labelCacheExpire.Name = "labelCacheExpire";\r
-            this.toolTip.SetToolTip(this.labelCacheExpire, resources.GetString("labelCacheExpire.ToolTip"));\r
-            // \r
-            // textBoxUserAgent\r
-            // \r
-            resources.ApplyResources(this.textBoxUserAgent, "textBoxUserAgent");\r
-            this.textBoxUserAgent.Name = "textBoxUserAgent";\r
-            this.toolTip.SetToolTip(this.textBoxUserAgent, resources.GetString("textBoxUserAgent.ToolTip"));\r
-            // \r
-            // labelUserAgent\r
-            // \r
-            resources.ApplyResources(this.labelUserAgent, "labelUserAgent");\r
-            this.labelUserAgent.Name = "labelUserAgent";\r
-            this.toolTip.SetToolTip(this.labelUserAgent, resources.GetString("labelUserAgent.ToolTip"));\r
-            // \r
-            // errorProvider\r
-            // \r
-            this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;\r
-            this.errorProvider.ContainerControl = this;\r
-            // \r
-            // toolTip\r
-            // \r
-            this.toolTip.AutoPopDelay = 10000;\r
-            this.toolTip.InitialDelay = 500;\r
-            this.toolTip.ReshowDelay = 100;\r
-            // \r
-            // ColumnFromCode\r
-            // \r
-            resources.ApplyResources(this.ColumnFromCode, "ColumnFromCode");\r
-            this.ColumnFromCode.MaxInputLength = 16;\r
-            this.ColumnFromCode.Name = "ColumnFromCode";\r
-            // \r
-            // ColumnFromTitle\r
-            // \r
-            resources.ApplyResources(this.ColumnFromTitle, "ColumnFromTitle");\r
-            this.ColumnFromTitle.MaxInputLength = 255;\r
-            this.ColumnFromTitle.Name = "ColumnFromTitle";\r
-            // \r
-            // ColumnAlias\r
-            // \r
-            resources.ApplyResources(this.ColumnAlias, "ColumnAlias");\r
-            this.ColumnAlias.MaxInputLength = 255;\r
-            this.ColumnAlias.Name = "ColumnAlias";\r
-            // \r
-            // ColumnArrow\r
-            // \r
-            resources.ApplyResources(this.ColumnArrow, "ColumnArrow");\r
-            this.ColumnArrow.Name = "ColumnArrow";\r
-            this.ColumnArrow.ReadOnly = true;\r
-            this.ColumnArrow.Resizable = System.Windows.Forms.DataGridViewTriState.False;\r
-            this.ColumnArrow.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
-            // \r
-            // ColumnToCode\r
-            // \r
-            resources.ApplyResources(this.ColumnToCode, "ColumnToCode");\r
-            this.ColumnToCode.MaxInputLength = 16;\r
-            this.ColumnToCode.Name = "ColumnToCode";\r
-            // \r
-            // ColumnToTitle\r
-            // \r
-            resources.ApplyResources(this.ColumnToTitle, "ColumnToTitle");\r
-            this.ColumnToTitle.MaxInputLength = 255;\r
-            this.ColumnToTitle.Name = "ColumnToTitle";\r
-            // \r
-            // ColumnTimestamp\r
-            // \r
-            resources.ApplyResources(this.ColumnTimestamp, "ColumnTimestamp");\r
-            this.ColumnTimestamp.Name = "ColumnTimestamp";\r
-            // \r
-            // ConfigForm\r
-            // \r
-            this.AcceptButton = this.buttonOk;\r
-            resources.ApplyResources(this, "$this");\r
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.CancelButton = this.buttonCancel;\r
-            this.Controls.Add(this.tabControl);\r
-            this.Controls.Add(this.buttonCancel);\r
-            this.Controls.Add(this.buttonOk);\r
-            this.MinimizeBox = false;\r
-            this.Name = "ConfigForm";\r
-            this.ShowIcon = false;\r
-            this.ShowInTaskbar = false;\r
-            this.Load += new System.EventHandler(this.ConfigForm_Load);\r
-            this.tabControl.ResumeLayout(false);\r
-            this.tabPageItems.ResumeLayout(false);\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewItems)).EndInit();\r
-            this.tabPageHeadings.ResumeLayout(false);\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHeading)).EndInit();\r
-            this.tabPageServer.ResumeLayout(false);\r
-            this.tabPageServer.PerformLayout();\r
-            this.groupBoxLanguage.ResumeLayout(false);\r
-            this.groupBoxLanguage.PerformLayout();\r
-            this.groupBoxLanguageName.ResumeLayout(false);\r
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewLanguageName)).EndInit();\r
-            this.groupBoxServer.ResumeLayout(false);\r
-            this.groupBoxServer.PerformLayout();\r
-            this.tabPageApplication.ResumeLayout(false);\r
-            this.groupBoxInformation.ResumeLayout(false);\r
-            this.groupBoxInformation.PerformLayout();\r
-            this.groupBoxApplicationConfig.ResumeLayout(false);\r
-            this.groupBoxApplicationConfig.PerformLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();\r
-            this.ResumeLayout(false);\r
-\r
-        }\r
-\r
-        #endregion\r
-\r
-        private System.Windows.Forms.Button buttonOk;\r
-        private System.Windows.Forms.Button buttonCancel;\r
-        private System.Windows.Forms.TabControl tabControl;\r
-        private System.Windows.Forms.TabPage tabPageItems;\r
-        private System.Windows.Forms.TabPage tabPageHeadings;\r
-        private System.Windows.Forms.DataGridView dataGridViewItems;\r
-        private System.Windows.Forms.DataGridView dataGridViewHeading;\r
-        private System.Windows.Forms.TabPage tabPageServer;\r
-        private System.Windows.Forms.TabPage tabPageApplication;\r
-        private System.Windows.Forms.ComboBox comboBoxLanguage;\r
-        private System.Windows.Forms.Label labelLanguage;\r
-        private System.Windows.Forms.TextBox textBoxUserAgent;\r
-        private System.Windows.Forms.Label labelUserAgent;\r
-        private System.Windows.Forms.TextBox textBoxReferer;\r
-        private System.Windows.Forms.Label labelReferer;\r
-        private System.Windows.Forms.Label labelCacheExpire;\r
-        private System.Windows.Forms.TextBox textBoxCacheExpire;\r
-        private System.Windows.Forms.GroupBox groupBoxApplicationConfig;\r
-        private System.Windows.Forms.GroupBox groupBoxInformation;\r
-        private System.Windows.Forms.Label labelApplicationName;\r
-        private System.Windows.Forms.LinkLabel linkLabelWebsite;\r
-        private System.Windows.Forms.Label labelCopyright;\r
-        private System.Windows.Forms.Label labelWebsite;\r
-        private System.Windows.Forms.Label labelRefererNote;\r
-        private System.Windows.Forms.Label labelUserAgentNote;\r
-        private System.Windows.Forms.Label labelChaceNote;\r
-        private System.Windows.Forms.GroupBox groupBoxServer;\r
-        private System.Windows.Forms.TextBox textBoxLocation;\r
-        private System.Windows.Forms.Label labelLocation;\r
-        private System.Windows.Forms.TextBox textBoxNamespacePath;\r
-        private System.Windows.Forms.Label labelNamespacePath;\r
-        private System.Windows.Forms.TextBox textBoxExportPath;\r
-        private System.Windows.Forms.Label labelExportPath;\r
-        private System.Windows.Forms.TextBox textBoxRedirect;\r
-        private System.Windows.Forms.Label labelRedirect;\r
-        private System.Windows.Forms.Label labelTemplateNamespace;\r
-        private System.Windows.Forms.TextBox textBoxTemplateNamespace;\r
-        private System.Windows.Forms.Label labelFileNamespace;\r
-        private System.Windows.Forms.TextBox textBoxCategoryNamespace;\r
-        private System.Windows.Forms.Label labelCategoryNamespace;\r
-        private System.Windows.Forms.TextBox textBoxFileNamespace;\r
-        private System.Windows.Forms.GroupBox groupBoxLanguage;\r
-        private System.Windows.Forms.Label labelBracket;\r
-        private System.Windows.Forms.TextBox textBoxBracket;\r
-        private System.Windows.Forms.GroupBox groupBoxLanguageName;\r
-        private System.Windows.Forms.DataGridView dataGridViewLanguageName;\r
-        private System.Windows.Forms.CheckBox checkBoxIgnoreError;\r
-        private System.Windows.Forms.Label labelDocumentationTemplate;\r
-        private System.Windows.Forms.TextBox textBoxDocumentationTemplateDefaultPage;\r
-        private System.Windows.Forms.Label labelDocumentationTemplateDefaultPage;\r
-        private System.Windows.Forms.TextBox textBoxDocumentationTemplate;\r
-        private System.Windows.Forms.ErrorProvider errorProvider;\r
-        private System.Windows.Forms.ToolTip toolTip;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnCode;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnName;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnShortName;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnFromCode;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnFromTitle;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnAlias;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnArrow;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnToCode;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnToTitle;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnTimestamp;\r
-    }\r
+namespace Honememo.Wptscs
+{
+    partial class ConfigForm
+    {
+        /// <summary>
+        /// 必要なデザイナ変数です。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 使用中のリソースをすべてクリーンアップします。
+        /// </summary>
+        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows フォーム デザイナで生成されたコード
+
+        /// <summary>
+        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
+        /// コード エディタで変更しないでください。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigForm));
+            this.buttonOk = new System.Windows.Forms.Button();
+            this.buttonCancel = new System.Windows.Forms.Button();
+            this.tabControl = new System.Windows.Forms.TabControl();
+            this.tabPageItems = new System.Windows.Forms.TabPage();
+            this.dataGridViewItems = new System.Windows.Forms.DataGridView();
+            this.tabPageHeadings = new System.Windows.Forms.TabPage();
+            this.dataGridViewHeading = new System.Windows.Forms.DataGridView();
+            this.tabPageServer = new System.Windows.Forms.TabPage();
+            this.groupBoxLanguage = new System.Windows.Forms.GroupBox();
+            this.groupBoxLanguageName = new System.Windows.Forms.GroupBox();
+            this.dataGridViewLanguageName = new System.Windows.Forms.DataGridView();
+            this.ColumnCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnShortName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.textBoxBracket = new System.Windows.Forms.TextBox();
+            this.labelBracket = new System.Windows.Forms.Label();
+            this.groupBoxServer = new System.Windows.Forms.GroupBox();
+            this.textBoxDocumentationTemplateDefaultPage = new System.Windows.Forms.TextBox();
+            this.labelDocumentationTemplateDefaultPage = new System.Windows.Forms.Label();
+            this.textBoxDocumentationTemplate = new System.Windows.Forms.TextBox();
+            this.labelDocumentationTemplate = new System.Windows.Forms.Label();
+            this.textBoxFileNamespace = new System.Windows.Forms.TextBox();
+            this.labelFileNamespace = new System.Windows.Forms.Label();
+            this.textBoxCategoryNamespace = new System.Windows.Forms.TextBox();
+            this.labelCategoryNamespace = new System.Windows.Forms.Label();
+            this.textBoxTemplateNamespace = new System.Windows.Forms.TextBox();
+            this.labelTemplateNamespace = new System.Windows.Forms.Label();
+            this.textBoxRedirect = new System.Windows.Forms.TextBox();
+            this.labelRedirect = new System.Windows.Forms.Label();
+            this.textBoxExportPath = new System.Windows.Forms.TextBox();
+            this.labelExportPath = new System.Windows.Forms.Label();
+            this.textBoxNamespacePath = new System.Windows.Forms.TextBox();
+            this.labelNamespacePath = new System.Windows.Forms.Label();
+            this.textBoxLocation = new System.Windows.Forms.TextBox();
+            this.labelLocation = new System.Windows.Forms.Label();
+            this.comboBoxLanguage = new System.Windows.Forms.ComboBox();
+            this.labelLanguage = new System.Windows.Forms.Label();
+            this.tabPageApplication = new System.Windows.Forms.TabPage();
+            this.groupBoxInformation = new System.Windows.Forms.GroupBox();
+            this.labelWebsite = new System.Windows.Forms.Label();
+            this.linkLabelWebsite = new System.Windows.Forms.LinkLabel();
+            this.labelCopyright = new System.Windows.Forms.Label();
+            this.labelApplicationName = new System.Windows.Forms.Label();
+            this.groupBoxApplicationConfig = new System.Windows.Forms.GroupBox();
+            this.checkBoxIgnoreError = new System.Windows.Forms.CheckBox();
+            this.labelRefererNote = new System.Windows.Forms.Label();
+            this.labelUserAgentNote = new System.Windows.Forms.Label();
+            this.labelChaceNote = new System.Windows.Forms.Label();
+            this.textBoxCacheExpire = new System.Windows.Forms.TextBox();
+            this.textBoxReferer = new System.Windows.Forms.TextBox();
+            this.labelReferer = new System.Windows.Forms.Label();
+            this.labelCacheExpire = new System.Windows.Forms.Label();
+            this.textBoxUserAgent = new System.Windows.Forms.TextBox();
+            this.labelUserAgent = new System.Windows.Forms.Label();
+            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.ColumnFromCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnFromTitle = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnAlias = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnArrow = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnToCode = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnToTitle = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnTimestamp = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.tabControl.SuspendLayout();
+            this.tabPageItems.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewItems)).BeginInit();
+            this.tabPageHeadings.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHeading)).BeginInit();
+            this.tabPageServer.SuspendLayout();
+            this.groupBoxLanguage.SuspendLayout();
+            this.groupBoxLanguageName.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewLanguageName)).BeginInit();
+            this.groupBoxServer.SuspendLayout();
+            this.tabPageApplication.SuspendLayout();
+            this.groupBoxInformation.SuspendLayout();
+            this.groupBoxApplicationConfig.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // buttonOk
+            // 
+            resources.ApplyResources(this.buttonOk, "buttonOk");
+            this.buttonOk.Name = "buttonOk";
+            this.buttonOk.UseVisualStyleBackColor = true;
+            this.buttonOk.Click += new System.EventHandler(this.ButtonOk_Click);
+            // 
+            // buttonCancel
+            // 
+            resources.ApplyResources(this.buttonCancel, "buttonCancel");
+            this.buttonCancel.CausesValidation = false;
+            this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.buttonCancel.Name = "buttonCancel";
+            this.buttonCancel.UseVisualStyleBackColor = true;
+            // 
+            // tabControl
+            // 
+            resources.ApplyResources(this.tabControl, "tabControl");
+            this.tabControl.Controls.Add(this.tabPageItems);
+            this.tabControl.Controls.Add(this.tabPageHeadings);
+            this.tabControl.Controls.Add(this.tabPageServer);
+            this.tabControl.Controls.Add(this.tabPageApplication);
+            this.tabControl.Name = "tabControl";
+            this.tabControl.SelectedIndex = 0;
+            this.toolTip.SetToolTip(this.tabControl, resources.GetString("tabControl.ToolTip"));
+            // 
+            // tabPageItems
+            // 
+            this.tabPageItems.Controls.Add(this.dataGridViewItems);
+            resources.ApplyResources(this.tabPageItems, "tabPageItems");
+            this.tabPageItems.Name = "tabPageItems";
+            this.tabPageItems.UseVisualStyleBackColor = true;
+            // 
+            // dataGridViewItems
+            // 
+            resources.ApplyResources(this.dataGridViewItems, "dataGridViewItems");
+            this.dataGridViewItems.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridViewItems.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColumnFromCode,
+            this.ColumnFromTitle,
+            this.ColumnAlias,
+            this.ColumnArrow,
+            this.ColumnToCode,
+            this.ColumnToTitle,
+            this.ColumnTimestamp});
+            this.dataGridViewItems.Name = "dataGridViewItems";
+            this.dataGridViewItems.RowTemplate.Height = 21;
+            this.dataGridViewItems.CellValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridViewItems_CellValidated);
+            this.dataGridViewItems.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.DataGridViewItems_CellValidating);
+            this.dataGridViewItems.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridViewItems_CellValueChanged);
+            this.dataGridViewItems.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(this.DataGridViewItems_RowsAdded);
+            this.dataGridViewItems.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResetErrorText_RowValidated);
+            this.dataGridViewItems.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.DataGridViewItems_RowValidating);
+            // 
+            // tabPageHeadings
+            // 
+            this.tabPageHeadings.Controls.Add(this.dataGridViewHeading);
+            resources.ApplyResources(this.tabPageHeadings, "tabPageHeadings");
+            this.tabPageHeadings.Name = "tabPageHeadings";
+            this.tabPageHeadings.UseVisualStyleBackColor = true;
+            // 
+            // dataGridViewHeading
+            // 
+            resources.ApplyResources(this.dataGridViewHeading, "dataGridViewHeading");
+            this.dataGridViewHeading.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridViewHeading.Name = "dataGridViewHeading";
+            this.dataGridViewHeading.RowTemplate.Height = 21;
+            // 
+            // tabPageServer
+            // 
+            this.tabPageServer.Controls.Add(this.groupBoxLanguage);
+            this.tabPageServer.Controls.Add(this.groupBoxServer);
+            this.tabPageServer.Controls.Add(this.comboBoxLanguage);
+            this.tabPageServer.Controls.Add(this.labelLanguage);
+            resources.ApplyResources(this.tabPageServer, "tabPageServer");
+            this.tabPageServer.Name = "tabPageServer";
+            this.tabPageServer.UseVisualStyleBackColor = true;
+            // 
+            // groupBoxLanguage
+            // 
+            resources.ApplyResources(this.groupBoxLanguage, "groupBoxLanguage");
+            this.groupBoxLanguage.Controls.Add(this.groupBoxLanguageName);
+            this.groupBoxLanguage.Controls.Add(this.textBoxBracket);
+            this.groupBoxLanguage.Controls.Add(this.labelBracket);
+            this.groupBoxLanguage.Name = "groupBoxLanguage";
+            this.groupBoxLanguage.TabStop = false;
+            // 
+            // groupBoxLanguageName
+            // 
+            resources.ApplyResources(this.groupBoxLanguageName, "groupBoxLanguageName");
+            this.groupBoxLanguageName.Controls.Add(this.dataGridViewLanguageName);
+            this.groupBoxLanguageName.Name = "groupBoxLanguageName";
+            this.groupBoxLanguageName.TabStop = false;
+            this.toolTip.SetToolTip(this.groupBoxLanguageName, resources.GetString("groupBoxLanguageName.ToolTip"));
+            // 
+            // dataGridViewLanguageName
+            // 
+            resources.ApplyResources(this.dataGridViewLanguageName, "dataGridViewLanguageName");
+            this.dataGridViewLanguageName.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridViewLanguageName.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColumnCode,
+            this.ColumnName,
+            this.ColumnShortName});
+            this.dataGridViewLanguageName.Name = "dataGridViewLanguageName";
+            this.dataGridViewLanguageName.RowTemplate.Height = 21;
+            this.dataGridViewLanguageName.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.ResetErrorText_RowValidated);
+            this.dataGridViewLanguageName.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.DataGridViewLanguageName_RowValidating);
+            this.dataGridViewLanguageName.Validating += new System.ComponentModel.CancelEventHandler(this.DataGridViewLanguageName_Validating);
+            this.dataGridViewLanguageName.Validated += new System.EventHandler(this.ResetErrorText_Validated);
+            // 
+            // ColumnCode
+            // 
+            this.ColumnCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+            resources.ApplyResources(this.ColumnCode, "ColumnCode");
+            this.ColumnCode.MaxInputLength = 10;
+            this.ColumnCode.Name = "ColumnCode";
+            // 
+            // ColumnName
+            // 
+            this.ColumnName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+            resources.ApplyResources(this.ColumnName, "ColumnName");
+            this.ColumnName.MaxInputLength = 255;
+            this.ColumnName.Name = "ColumnName";
+            // 
+            // ColumnShortName
+            // 
+            this.ColumnShortName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+            resources.ApplyResources(this.ColumnShortName, "ColumnShortName");
+            this.ColumnShortName.MaxInputLength = 20;
+            this.ColumnShortName.Name = "ColumnShortName";
+            // 
+            // textBoxBracket
+            // 
+            resources.ApplyResources(this.textBoxBracket, "textBoxBracket");
+            this.textBoxBracket.Name = "textBoxBracket";
+            this.toolTip.SetToolTip(this.textBoxBracket, resources.GetString("textBoxBracket.ToolTip"));
+            // 
+            // labelBracket
+            // 
+            resources.ApplyResources(this.labelBracket, "labelBracket");
+            this.labelBracket.Name = "labelBracket";
+            this.toolTip.SetToolTip(this.labelBracket, resources.GetString("labelBracket.ToolTip"));
+            // 
+            // groupBoxServer
+            // 
+            resources.ApplyResources(this.groupBoxServer, "groupBoxServer");
+            this.groupBoxServer.Controls.Add(this.textBoxDocumentationTemplateDefaultPage);
+            this.groupBoxServer.Controls.Add(this.labelDocumentationTemplateDefaultPage);
+            this.groupBoxServer.Controls.Add(this.textBoxDocumentationTemplate);
+            this.groupBoxServer.Controls.Add(this.labelDocumentationTemplate);
+            this.groupBoxServer.Controls.Add(this.textBoxFileNamespace);
+            this.groupBoxServer.Controls.Add(this.labelFileNamespace);
+            this.groupBoxServer.Controls.Add(this.textBoxCategoryNamespace);
+            this.groupBoxServer.Controls.Add(this.labelCategoryNamespace);
+            this.groupBoxServer.Controls.Add(this.textBoxTemplateNamespace);
+            this.groupBoxServer.Controls.Add(this.labelTemplateNamespace);
+            this.groupBoxServer.Controls.Add(this.textBoxRedirect);
+            this.groupBoxServer.Controls.Add(this.labelRedirect);
+            this.groupBoxServer.Controls.Add(this.textBoxExportPath);
+            this.groupBoxServer.Controls.Add(this.labelExportPath);
+            this.groupBoxServer.Controls.Add(this.textBoxNamespacePath);
+            this.groupBoxServer.Controls.Add(this.labelNamespacePath);
+            this.groupBoxServer.Controls.Add(this.textBoxLocation);
+            this.groupBoxServer.Controls.Add(this.labelLocation);
+            this.groupBoxServer.Name = "groupBoxServer";
+            this.groupBoxServer.TabStop = false;
+            // 
+            // textBoxDocumentationTemplateDefaultPage
+            // 
+            resources.ApplyResources(this.textBoxDocumentationTemplateDefaultPage, "textBoxDocumentationTemplateDefaultPage");
+            this.textBoxDocumentationTemplateDefaultPage.Name = "textBoxDocumentationTemplateDefaultPage";
+            this.toolTip.SetToolTip(this.textBoxDocumentationTemplateDefaultPage, resources.GetString("textBoxDocumentationTemplateDefaultPage.ToolTip"));
+            // 
+            // labelDocumentationTemplateDefaultPage
+            // 
+            resources.ApplyResources(this.labelDocumentationTemplateDefaultPage, "labelDocumentationTemplateDefaultPage");
+            this.labelDocumentationTemplateDefaultPage.Name = "labelDocumentationTemplateDefaultPage";
+            this.toolTip.SetToolTip(this.labelDocumentationTemplateDefaultPage, resources.GetString("labelDocumentationTemplateDefaultPage.ToolTip"));
+            // 
+            // textBoxDocumentationTemplate
+            // 
+            resources.ApplyResources(this.textBoxDocumentationTemplate, "textBoxDocumentationTemplate");
+            this.textBoxDocumentationTemplate.Name = "textBoxDocumentationTemplate";
+            this.toolTip.SetToolTip(this.textBoxDocumentationTemplate, resources.GetString("textBoxDocumentationTemplate.ToolTip"));
+            // 
+            // labelDocumentationTemplate
+            // 
+            resources.ApplyResources(this.labelDocumentationTemplate, "labelDocumentationTemplate");
+            this.labelDocumentationTemplate.Name = "labelDocumentationTemplate";
+            this.toolTip.SetToolTip(this.labelDocumentationTemplate, resources.GetString("labelDocumentationTemplate.ToolTip"));
+            // 
+            // textBoxFileNamespace
+            // 
+            resources.ApplyResources(this.textBoxFileNamespace, "textBoxFileNamespace");
+            this.textBoxFileNamespace.Name = "textBoxFileNamespace";
+            this.toolTip.SetToolTip(this.textBoxFileNamespace, resources.GetString("textBoxFileNamespace.ToolTip"));
+            this.textBoxFileNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);
+            this.textBoxFileNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);
+            // 
+            // labelFileNamespace
+            // 
+            resources.ApplyResources(this.labelFileNamespace, "labelFileNamespace");
+            this.labelFileNamespace.Name = "labelFileNamespace";
+            this.toolTip.SetToolTip(this.labelFileNamespace, resources.GetString("labelFileNamespace.ToolTip"));
+            // 
+            // textBoxCategoryNamespace
+            // 
+            resources.ApplyResources(this.textBoxCategoryNamespace, "textBoxCategoryNamespace");
+            this.textBoxCategoryNamespace.Name = "textBoxCategoryNamespace";
+            this.toolTip.SetToolTip(this.textBoxCategoryNamespace, resources.GetString("textBoxCategoryNamespace.ToolTip"));
+            this.textBoxCategoryNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);
+            this.textBoxCategoryNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);
+            // 
+            // labelCategoryNamespace
+            // 
+            resources.ApplyResources(this.labelCategoryNamespace, "labelCategoryNamespace");
+            this.labelCategoryNamespace.Name = "labelCategoryNamespace";
+            this.toolTip.SetToolTip(this.labelCategoryNamespace, resources.GetString("labelCategoryNamespace.ToolTip"));
+            // 
+            // textBoxTemplateNamespace
+            // 
+            resources.ApplyResources(this.textBoxTemplateNamespace, "textBoxTemplateNamespace");
+            this.textBoxTemplateNamespace.Name = "textBoxTemplateNamespace";
+            this.toolTip.SetToolTip(this.textBoxTemplateNamespace, resources.GetString("textBoxTemplateNamespace.ToolTip"));
+            this.textBoxTemplateNamespace.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxNamespace_Validating);
+            this.textBoxTemplateNamespace.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);
+            // 
+            // labelTemplateNamespace
+            // 
+            resources.ApplyResources(this.labelTemplateNamespace, "labelTemplateNamespace");
+            this.labelTemplateNamespace.Name = "labelTemplateNamespace";
+            this.toolTip.SetToolTip(this.labelTemplateNamespace, resources.GetString("labelTemplateNamespace.ToolTip"));
+            // 
+            // textBoxRedirect
+            // 
+            resources.ApplyResources(this.textBoxRedirect, "textBoxRedirect");
+            this.textBoxRedirect.Name = "textBoxRedirect";
+            this.toolTip.SetToolTip(this.textBoxRedirect, resources.GetString("textBoxRedirect.ToolTip"));
+            // 
+            // labelRedirect
+            // 
+            resources.ApplyResources(this.labelRedirect, "labelRedirect");
+            this.labelRedirect.Name = "labelRedirect";
+            this.toolTip.SetToolTip(this.labelRedirect, resources.GetString("labelRedirect.ToolTip"));
+            // 
+            // textBoxExportPath
+            // 
+            resources.ApplyResources(this.textBoxExportPath, "textBoxExportPath");
+            this.textBoxExportPath.Name = "textBoxExportPath";
+            this.toolTip.SetToolTip(this.textBoxExportPath, resources.GetString("textBoxExportPath.ToolTip"));
+            // 
+            // labelExportPath
+            // 
+            resources.ApplyResources(this.labelExportPath, "labelExportPath");
+            this.labelExportPath.Name = "labelExportPath";
+            this.toolTip.SetToolTip(this.labelExportPath, resources.GetString("labelExportPath.ToolTip"));
+            // 
+            // textBoxNamespacePath
+            // 
+            resources.ApplyResources(this.textBoxNamespacePath, "textBoxNamespacePath");
+            this.textBoxNamespacePath.Name = "textBoxNamespacePath";
+            this.toolTip.SetToolTip(this.textBoxNamespacePath, resources.GetString("textBoxNamespacePath.ToolTip"));
+            // 
+            // labelNamespacePath
+            // 
+            resources.ApplyResources(this.labelNamespacePath, "labelNamespacePath");
+            this.labelNamespacePath.Name = "labelNamespacePath";
+            this.toolTip.SetToolTip(this.labelNamespacePath, resources.GetString("labelNamespacePath.ToolTip"));
+            // 
+            // textBoxLocation
+            // 
+            resources.ApplyResources(this.textBoxLocation, "textBoxLocation");
+            this.textBoxLocation.Name = "textBoxLocation";
+            this.toolTip.SetToolTip(this.textBoxLocation, resources.GetString("textBoxLocation.ToolTip"));
+            // 
+            // labelLocation
+            // 
+            resources.ApplyResources(this.labelLocation, "labelLocation");
+            this.labelLocation.Name = "labelLocation";
+            this.toolTip.SetToolTip(this.labelLocation, resources.GetString("labelLocation.ToolTip"));
+            // 
+            // comboBoxLanguage
+            // 
+            this.comboBoxLanguage.FormattingEnabled = true;
+            resources.ApplyResources(this.comboBoxLanguage, "comboBoxLanguage");
+            this.comboBoxLanguage.Name = "comboBoxLanguage";
+            this.toolTip.SetToolTip(this.comboBoxLanguage, resources.GetString("comboBoxLanguage.ToolTip"));
+            this.comboBoxLanguage.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLanguuage_SelectedIndexChanged);
+            this.comboBoxLanguage.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ComboBoxLanguage_KeyDown);
+            this.comboBoxLanguage.Leave += new System.EventHandler(this.ComboBoxLanguage_Leave);
+            // 
+            // labelLanguage
+            // 
+            resources.ApplyResources(this.labelLanguage, "labelLanguage");
+            this.labelLanguage.Name = "labelLanguage";
+            this.toolTip.SetToolTip(this.labelLanguage, resources.GetString("labelLanguage.ToolTip"));
+            // 
+            // tabPageApplication
+            // 
+            this.tabPageApplication.Controls.Add(this.groupBoxInformation);
+            this.tabPageApplication.Controls.Add(this.groupBoxApplicationConfig);
+            resources.ApplyResources(this.tabPageApplication, "tabPageApplication");
+            this.tabPageApplication.Name = "tabPageApplication";
+            this.tabPageApplication.UseVisualStyleBackColor = true;
+            // 
+            // groupBoxInformation
+            // 
+            resources.ApplyResources(this.groupBoxInformation, "groupBoxInformation");
+            this.groupBoxInformation.Controls.Add(this.labelWebsite);
+            this.groupBoxInformation.Controls.Add(this.linkLabelWebsite);
+            this.groupBoxInformation.Controls.Add(this.labelCopyright);
+            this.groupBoxInformation.Controls.Add(this.labelApplicationName);
+            this.groupBoxInformation.Name = "groupBoxInformation";
+            this.groupBoxInformation.TabStop = false;
+            // 
+            // labelWebsite
+            // 
+            resources.ApplyResources(this.labelWebsite, "labelWebsite");
+            this.labelWebsite.Name = "labelWebsite";
+            // 
+            // linkLabelWebsite
+            // 
+            resources.ApplyResources(this.linkLabelWebsite, "linkLabelWebsite");
+            this.linkLabelWebsite.Name = "linkLabelWebsite";
+            this.linkLabelWebsite.TabStop = true;
+            this.linkLabelWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelWebsite_LinkClicked);
+            // 
+            // labelCopyright
+            // 
+            resources.ApplyResources(this.labelCopyright, "labelCopyright");
+            this.labelCopyright.Name = "labelCopyright";
+            // 
+            // labelApplicationName
+            // 
+            resources.ApplyResources(this.labelApplicationName, "labelApplicationName");
+            this.labelApplicationName.Name = "labelApplicationName";
+            // 
+            // groupBoxApplicationConfig
+            // 
+            resources.ApplyResources(this.groupBoxApplicationConfig, "groupBoxApplicationConfig");
+            this.groupBoxApplicationConfig.Controls.Add(this.checkBoxIgnoreError);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelRefererNote);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelUserAgentNote);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelChaceNote);
+            this.groupBoxApplicationConfig.Controls.Add(this.textBoxCacheExpire);
+            this.groupBoxApplicationConfig.Controls.Add(this.textBoxReferer);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelReferer);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelCacheExpire);
+            this.groupBoxApplicationConfig.Controls.Add(this.textBoxUserAgent);
+            this.groupBoxApplicationConfig.Controls.Add(this.labelUserAgent);
+            this.groupBoxApplicationConfig.Name = "groupBoxApplicationConfig";
+            this.groupBoxApplicationConfig.TabStop = false;
+            // 
+            // checkBoxIgnoreError
+            // 
+            resources.ApplyResources(this.checkBoxIgnoreError, "checkBoxIgnoreError");
+            this.checkBoxIgnoreError.Name = "checkBoxIgnoreError";
+            this.toolTip.SetToolTip(this.checkBoxIgnoreError, resources.GetString("checkBoxIgnoreError.ToolTip"));
+            this.checkBoxIgnoreError.UseVisualStyleBackColor = true;
+            // 
+            // labelRefererNote
+            // 
+            resources.ApplyResources(this.labelRefererNote, "labelRefererNote");
+            this.labelRefererNote.Name = "labelRefererNote";
+            // 
+            // labelUserAgentNote
+            // 
+            resources.ApplyResources(this.labelUserAgentNote, "labelUserAgentNote");
+            this.labelUserAgentNote.Name = "labelUserAgentNote";
+            // 
+            // labelChaceNote
+            // 
+            resources.ApplyResources(this.labelChaceNote, "labelChaceNote");
+            this.labelChaceNote.Name = "labelChaceNote";
+            // 
+            // textBoxCacheExpire
+            // 
+            resources.ApplyResources(this.textBoxCacheExpire, "textBoxCacheExpire");
+            this.textBoxCacheExpire.Name = "textBoxCacheExpire";
+            this.toolTip.SetToolTip(this.textBoxCacheExpire, resources.GetString("textBoxCacheExpire.ToolTip"));
+            this.textBoxCacheExpire.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxCacheExpire_Validating);
+            this.textBoxCacheExpire.Validated += new System.EventHandler(this.ResetErrorProvider_Validated);
+            // 
+            // textBoxReferer
+            // 
+            resources.ApplyResources(this.textBoxReferer, "textBoxReferer");
+            this.textBoxReferer.Name = "textBoxReferer";
+            this.toolTip.SetToolTip(this.textBoxReferer, resources.GetString("textBoxReferer.ToolTip"));
+            // 
+            // labelReferer
+            // 
+            resources.ApplyResources(this.labelReferer, "labelReferer");
+            this.labelReferer.Name = "labelReferer";
+            this.toolTip.SetToolTip(this.labelReferer, resources.GetString("labelReferer.ToolTip"));
+            // 
+            // labelCacheExpire
+            // 
+            resources.ApplyResources(this.labelCacheExpire, "labelCacheExpire");
+            this.labelCacheExpire.Name = "labelCacheExpire";
+            this.toolTip.SetToolTip(this.labelCacheExpire, resources.GetString("labelCacheExpire.ToolTip"));
+            // 
+            // textBoxUserAgent
+            // 
+            resources.ApplyResources(this.textBoxUserAgent, "textBoxUserAgent");
+            this.textBoxUserAgent.Name = "textBoxUserAgent";
+            this.toolTip.SetToolTip(this.textBoxUserAgent, resources.GetString("textBoxUserAgent.ToolTip"));
+            // 
+            // labelUserAgent
+            // 
+            resources.ApplyResources(this.labelUserAgent, "labelUserAgent");
+            this.labelUserAgent.Name = "labelUserAgent";
+            this.toolTip.SetToolTip(this.labelUserAgent, resources.GetString("labelUserAgent.ToolTip"));
+            // 
+            // errorProvider
+            // 
+            this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+            this.errorProvider.ContainerControl = this;
+            // 
+            // toolTip
+            // 
+            this.toolTip.AutoPopDelay = 10000;
+            this.toolTip.InitialDelay = 500;
+            this.toolTip.ReshowDelay = 100;
+            // 
+            // ColumnFromCode
+            // 
+            resources.ApplyResources(this.ColumnFromCode, "ColumnFromCode");
+            this.ColumnFromCode.MaxInputLength = 16;
+            this.ColumnFromCode.Name = "ColumnFromCode";
+            // 
+            // ColumnFromTitle
+            // 
+            resources.ApplyResources(this.ColumnFromTitle, "ColumnFromTitle");
+            this.ColumnFromTitle.MaxInputLength = 255;
+            this.ColumnFromTitle.Name = "ColumnFromTitle";
+            // 
+            // ColumnAlias
+            // 
+            resources.ApplyResources(this.ColumnAlias, "ColumnAlias");
+            this.ColumnAlias.MaxInputLength = 255;
+            this.ColumnAlias.Name = "ColumnAlias";
+            // 
+            // ColumnArrow
+            // 
+            resources.ApplyResources(this.ColumnArrow, "ColumnArrow");
+            this.ColumnArrow.Name = "ColumnArrow";
+            this.ColumnArrow.ReadOnly = true;
+            this.ColumnArrow.Resizable = System.Windows.Forms.DataGridViewTriState.False;
+            this.ColumnArrow.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
+            // 
+            // ColumnToCode
+            // 
+            resources.ApplyResources(this.ColumnToCode, "ColumnToCode");
+            this.ColumnToCode.MaxInputLength = 16;
+            this.ColumnToCode.Name = "ColumnToCode";
+            // 
+            // ColumnToTitle
+            // 
+            resources.ApplyResources(this.ColumnToTitle, "ColumnToTitle");
+            this.ColumnToTitle.MaxInputLength = 255;
+            this.ColumnToTitle.Name = "ColumnToTitle";
+            // 
+            // ColumnTimestamp
+            // 
+            resources.ApplyResources(this.ColumnTimestamp, "ColumnTimestamp");
+            this.ColumnTimestamp.Name = "ColumnTimestamp";
+            // 
+            // ConfigForm
+            // 
+            this.AcceptButton = this.buttonOk;
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.buttonCancel;
+            this.Controls.Add(this.tabControl);
+            this.Controls.Add(this.buttonCancel);
+            this.Controls.Add(this.buttonOk);
+            this.MinimizeBox = false;
+            this.Name = "ConfigForm";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.Load += new System.EventHandler(this.ConfigForm_Load);
+            this.tabControl.ResumeLayout(false);
+            this.tabPageItems.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewItems)).EndInit();
+            this.tabPageHeadings.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewHeading)).EndInit();
+            this.tabPageServer.ResumeLayout(false);
+            this.tabPageServer.PerformLayout();
+            this.groupBoxLanguage.ResumeLayout(false);
+            this.groupBoxLanguage.PerformLayout();
+            this.groupBoxLanguageName.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridViewLanguageName)).EndInit();
+            this.groupBoxServer.ResumeLayout(false);
+            this.groupBoxServer.PerformLayout();
+            this.tabPageApplication.ResumeLayout(false);
+            this.groupBoxInformation.ResumeLayout(false);
+            this.groupBoxInformation.PerformLayout();
+            this.groupBoxApplicationConfig.ResumeLayout(false);
+            this.groupBoxApplicationConfig.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button buttonOk;
+        private System.Windows.Forms.Button buttonCancel;
+        private System.Windows.Forms.TabControl tabControl;
+        private System.Windows.Forms.TabPage tabPageItems;
+        private System.Windows.Forms.TabPage tabPageHeadings;
+        private System.Windows.Forms.DataGridView dataGridViewItems;
+        private System.Windows.Forms.DataGridView dataGridViewHeading;
+        private System.Windows.Forms.TabPage tabPageServer;
+        private System.Windows.Forms.TabPage tabPageApplication;
+        private System.Windows.Forms.ComboBox comboBoxLanguage;
+        private System.Windows.Forms.Label labelLanguage;
+        private System.Windows.Forms.TextBox textBoxUserAgent;
+        private System.Windows.Forms.Label labelUserAgent;
+        private System.Windows.Forms.TextBox textBoxReferer;
+        private System.Windows.Forms.Label labelReferer;
+        private System.Windows.Forms.Label labelCacheExpire;
+        private System.Windows.Forms.TextBox textBoxCacheExpire;
+        private System.Windows.Forms.GroupBox groupBoxApplicationConfig;
+        private System.Windows.Forms.GroupBox groupBoxInformation;
+        private System.Windows.Forms.Label labelApplicationName;
+        private System.Windows.Forms.LinkLabel linkLabelWebsite;
+        private System.Windows.Forms.Label labelCopyright;
+        private System.Windows.Forms.Label labelWebsite;
+        private System.Windows.Forms.Label labelRefererNote;
+        private System.Windows.Forms.Label labelUserAgentNote;
+        private System.Windows.Forms.Label labelChaceNote;
+        private System.Windows.Forms.GroupBox groupBoxServer;
+        private System.Windows.Forms.TextBox textBoxLocation;
+        private System.Windows.Forms.Label labelLocation;
+        private System.Windows.Forms.TextBox textBoxNamespacePath;
+        private System.Windows.Forms.Label labelNamespacePath;
+        private System.Windows.Forms.TextBox textBoxExportPath;
+        private System.Windows.Forms.Label labelExportPath;
+        private System.Windows.Forms.TextBox textBoxRedirect;
+        private System.Windows.Forms.Label labelRedirect;
+        private System.Windows.Forms.Label labelTemplateNamespace;
+        private System.Windows.Forms.TextBox textBoxTemplateNamespace;
+        private System.Windows.Forms.Label labelFileNamespace;
+        private System.Windows.Forms.TextBox textBoxCategoryNamespace;
+        private System.Windows.Forms.Label labelCategoryNamespace;
+        private System.Windows.Forms.TextBox textBoxFileNamespace;
+        private System.Windows.Forms.GroupBox groupBoxLanguage;
+        private System.Windows.Forms.Label labelBracket;
+        private System.Windows.Forms.TextBox textBoxBracket;
+        private System.Windows.Forms.GroupBox groupBoxLanguageName;
+        private System.Windows.Forms.DataGridView dataGridViewLanguageName;
+        private System.Windows.Forms.CheckBox checkBoxIgnoreError;
+        private System.Windows.Forms.Label labelDocumentationTemplate;
+        private System.Windows.Forms.TextBox textBoxDocumentationTemplateDefaultPage;
+        private System.Windows.Forms.Label labelDocumentationTemplateDefaultPage;
+        private System.Windows.Forms.TextBox textBoxDocumentationTemplate;
+        private System.Windows.Forms.ErrorProvider errorProvider;
+        private System.Windows.Forms.ToolTip toolTip;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnCode;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnName;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnShortName;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnFromCode;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnFromTitle;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnAlias;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnArrow;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnToCode;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnToTitle;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColumnTimestamp;
+    }
 }
\ No newline at end of file
index 2578fd1..91b136d 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia翻訳支援ツール設定画面クラスソース</summary>\r
-//\r
-// <copyright file="ConfigForm.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.ComponentModel;\r
-    using System.Data;\r
-    using System.Drawing;\r
-    using System.Reflection;\r
-    using System.Text;\r
-    using System.Windows.Forms;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Models;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// Wikipedia翻訳支援ツール設定画面のクラスです。\r
-    /// </summary>\r
-    public partial class ConfigForm : Form\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 現在設定中のアプリケーションの設定。\r
-        /// </summary>\r
-        /// <remarks>設定画面を閉じた後は再読み込みされるので、必要に応じて随時更新してよい。</remarks>\r
-        private Config config;\r
-\r
-        /// <summary>\r
-        /// <seealso cref="comboBoxLanguage"/>で選択していたアイテムのバックアップ。\r
-        /// </summary>\r
-        private string comboBoxLanguageSelectedText;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        /// <param name="config">設定対象のConfig。</param>\r
-        /// <remarks>configは設定画面の操作により随時更新される。呼び出し元では再読み込みすること。</remarks>\r
-        public ConfigForm(Config config)\r
-        {\r
-            this.InitializeComponent();\r
-\r
-            // 設定対象のConfigを受け取る\r
-            this.config = Utilities.Validate.NotNull(config, "config");\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region フォームの各イベントのメソッド\r
-\r
-        /// <summary>\r
-        /// フォームロード時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ConfigForm_Load(object sender, EventArgs e)\r
-        {\r
-            try\r
-            {\r
-                // 各タブの内容を初期化する\r
-\r
-                // 記事の置き換えタブの初期化\r
-                this.ImportTranslationDictionaryView(this.dataGridViewItems, this.config.ItemTables);\r
-\r
-                // 見出しの置き換えタブの初期化\r
-                this.ImportTranslationTableView(this.dataGridViewHeading, this.config.HeadingTable);\r
-\r
-                // サーバー/言語タブの初期化\r
-                foreach (Website site in this.config.Websites)\r
-                {\r
-                    this.comboBoxLanguage.Items.Add(site.Language.Code);\r
-                }\r
-\r
-                // その他タブの初期化\r
-                this.textBoxCacheExpire.Text = Settings.Default.CacheExpire.Days.ToString();\r
-                this.textBoxUserAgent.Text = Settings.Default.UserAgent;\r
-                this.textBoxReferer.Text = Settings.Default.Referer;\r
-                this.checkBoxIgnoreError.Checked = Settings.Default.IgnoreError;\r
-                this.labelApplicationName.Text = FormUtils.ApplicationName();\r
-                AssemblyCopyrightAttribute copyright = Attribute.GetCustomAttribute(\r
-                    Assembly.GetExecutingAssembly(),\r
-                    typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute;\r
-                if (copyright != null)\r
-                {\r
-                    this.labelCopyright.Text = copyright.Copyright;\r
-                }\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                // 通常この処理では例外は発生しないはず(Configに読めているので)。想定外のエラー用\r
-                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// OKボタン押下時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ButtonOk_Click(object sender, EventArgs e)\r
-        {\r
-            try\r
-            {\r
-                // 各タブの内容を設定ファイルに保存する\r
-\r
-                // 記事の置き換えタブの保存\r
-                this.config.ItemTables = this.ExportTranslationDictionaryView(this.dataGridViewItems);\r
-\r
-                // 見出しの置き換えタブの保存\r
-                this.config.HeadingTable = this.ExportTranslationTableView(this.dataGridViewHeading);\r
-\r
-                // サーバー/言語タブの保存\r
-                // ※ このタブはコンボボックス変更のタイミングで保存されるので、そのメソッドを呼ぶ\r
-                this.ComboBoxLanguuage_SelectedIndexChanged(sender, e);\r
-\r
-                // その他タブの保存\r
-                Settings.Default.CacheExpire = new TimeSpan(int.Parse(this.textBoxCacheExpire.Text), 0, 0, 0);\r
-                Settings.Default.UserAgent = this.textBoxUserAgent.Text;\r
-                Settings.Default.Referer = this.textBoxReferer.Text;\r
-                Settings.Default.IgnoreError = this.checkBoxIgnoreError.Checked;\r
-\r
-                // 設定をファイルに保存\r
-                Settings.Default.Save();\r
-                try\r
-                {\r
-                    this.config.Save(Settings.Default.ConfigurationFile);\r
-\r
-                    // 全部成功なら画面を閉じる\r
-                    // ※ エラーの場合、どうしても駄目ならキャンセルボタンで閉じてもらう\r
-                    this.Close();\r
-                }\r
-                catch (Exception ex)\r
-                {\r
-                    // 異常時はエラーメッセージを表示\r
-                    // ※ この場合でもConfigオブジェクトは更新済みのため設定は一時的に有効\r
-                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);\r
-                    FormUtils.ErrorDialog(Resources.ErrorMessageConfigSaveFailed, ex.Message);\r
-                }\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                // 通常ファイル保存以外では例外は発生しないはず。想定外のエラー用\r
-                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 記事の置き換えタブのイベントのメソッド\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表への行追加時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewItems_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)\r
-        {\r
-            for (int i = e.RowIndex - 1; i < this.dataGridViewItems.Rows.Count; i++)\r
-            {\r
-                // プログラムから追加された場合は現在のインデックス、画面から追加した場合は+1したインデックスが来る\r
-                if (i >= 0)\r
-                {\r
-                    this.dataGridViewItems.Rows[i].Cells["ColumnArrow"].Value = Resources.RightArrow;\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表のセル編集時のバリデート処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewItems_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)\r
-        {\r
-            // 取得日時列のみチェック\r
-            if (this.dataGridViewItems.Columns[e.ColumnIndex].Name != "ColumnTimestamp")\r
-            {\r
-                return;\r
-            }\r
-\r
-            // 空または日付として認識可能な値の場合OK\r
-            string value = e.FormattedValue.ToString();\r
-            DateTime dummy;\r
-            if (String.IsNullOrWhiteSpace(value) || DateTime.TryParse(value, out dummy))\r
-            {\r
-                return;\r
-            }\r
-\r
-            // 不許可値の場合、NGメッセージを表示\r
-            this.dataGridViewItems.Rows[e.RowIndex].ErrorText = Resources.WarningMessageUnformatedTimestamp;\r
-            e.Cancel = true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表のセル編集時のバリデート成功時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewItems_CellValidated(object sender, DataGridViewCellEventArgs e)\r
-        {\r
-            // 取得日時列の場合、バリデートNGメッセージを消す\r
-            // ※ 他の列で消さないのは、エラーを出しているのがRowValidatingの場合もあるから\r
-            if (this.dataGridViewItems.Columns[e.ColumnIndex].Name == "ColumnTimestamp")\r
-            {\r
-                this.dataGridViewItems.Rows[e.RowIndex].ErrorText = String.Empty;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表のセル変更時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewItems_CellValueChanged(object sender, DataGridViewCellEventArgs e)\r
-        {\r
-            // 取得日時列が空の場合、有効期限が無期限として背景色を変更\r
-            // ※ ただし全列が空(新規行など)の場合は無視\r
-            if (e.RowIndex >= 0)\r
-            {\r
-                string value = FormUtils.ToString(this.dataGridViewItems["ColumnTimestamp", e.RowIndex]);\r
-                if (String.IsNullOrWhiteSpace(value)\r
-                    && !this.IsEmptyDataGridViewItemsRow(this.dataGridViewItems.Rows[e.RowIndex]))\r
-                {\r
-                    this.dataGridViewItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Bisque;\r
-                }\r
-                else\r
-                {\r
-                    this.dataGridViewItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = this.dataGridViewItems.DefaultCellStyle.BackColor;\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表の行編集時のバリデート処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewItems_RowValidating(object sender, DataGridViewCellCancelEventArgs e)\r
-        {\r
-            // 翻訳元、記事名、翻訳先が未入力の場合、バリデートNGメッセージを表示\r
-            // ※ ただし全列が空(新規行など)の場合は無視\r
-            DataGridViewRow row = this.dataGridViewItems.Rows[e.RowIndex];\r
-            if ((String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromCode"]))\r
-                || String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToCode"]))\r
-                || String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromTitle"])))\r
-                && !this.IsEmptyDataGridViewItemsRow(row))\r
-            {\r
-                row.ErrorText = Resources.WarningMessageEmptyTranslationDictionary;\r
-                e.Cancel = true;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表を使用する<see cref="DataGridView"/>の値設定を行う。\r
-        /// </summary>\r
-        /// <param name="view">対訳表を表示するビュー。</param>\r
-        /// <param name="dictionaries">対訳表データ。</param>\r
-        private void ImportTranslationDictionaryView(DataGridView view, IList<TranslationDictionary> dictionaries)\r
-        {\r
-            // 初期設定以外の場合も想定して最初にクリア\r
-            view.Rows.Clear();\r
-            foreach (TranslationDictionary dic in dictionaries)\r
-            {\r
-                foreach (KeyValuePair<string, TranslationDictionary.Item> item in dic)\r
-                {\r
-                    // 行を追加しその行を取得\r
-                    DataGridViewRow row = view.Rows[view.Rows.Add()];\r
-\r
-                    // 1行分の初期値を設定。右矢印は別途イベントで追加すること\r
-                    row.Cells["ColumnFromCode"].Value = dic.From;\r
-                    row.Cells["ColumnFromTitle"].Value = item.Key;\r
-                    row.Cells["ColumnAlias"].Value = item.Value.Alias;\r
-                    row.Cells["ColumnToCode"].Value = dic.To;\r
-                    row.Cells["ColumnToTitle"].Value = item.Value.Word;\r
-                    if (item.Value.Timestamp.HasValue)\r
-                    {\r
-                        row.Cells["ColumnTimestamp"].Value = item.Value.Timestamp.Value.ToLocalTime().ToString("G");\r
-                    }\r
-                }\r
-            }\r
-\r
-            // 取得日時の降順でソート、空の列は先頭にする\r
-            this.dataGridViewItems.Sort(new TranslationDictionaryViewComparer());\r
-\r
-            // 列幅をデータ長に応じて自動調整\r
-            // ※ 常に行ってしまうと、読み込みに非常に時間がかかるため\r
-            view.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表を使用する<see cref="DataGridView"/>からデータを抽出する。\r
-        /// </summary>\r
-        /// <param name="view">対訳表を表示するビュー。</param>\r
-        /// <returns>対訳表データ。</returns>\r
-        private IList<TranslationDictionary> ExportTranslationDictionaryView(DataGridView view)\r
-        {\r
-            IList<TranslationDictionary> dictionaries = new List<TranslationDictionary>();\r
-            foreach (DataGridViewRow row in view.Rows)\r
-            {\r
-                // 画面での追加用の最終行が空で渡されてくるので無視\r
-                if (this.IsEmptyDataGridViewItemsRow(row))\r
-                {\r
-                    continue;\r
-                }\r
-\r
-                // その行で対象とする言語を探索、無ければ新規作成\r
-                string from = FormUtils.ToString(row.Cells["ColumnFromCode"]);\r
-                string to = FormUtils.ToString(row.Cells["ColumnToCode"]);\r
-                TranslationDictionary dic\r
-                    = TranslationDictionary.GetDictionaryNeedCreate(dictionaries, from, to);\r
-\r
-                // 値を格納\r
-                TranslationDictionary.Item item = new TranslationDictionary.Item\r
-                {\r
-                    Word = FormUtils.ToString(row.Cells["ColumnToTitle"]),\r
-                    Alias = FormUtils.ToString(row.Cells["ColumnAlias"])\r
-                };\r
-\r
-                string timestamp = FormUtils.ToString(row.Cells["ColumnTimestamp"]);\r
-                if (!String.IsNullOrWhiteSpace(timestamp))\r
-                {\r
-                    item.Timestamp = DateTime.Parse(timestamp);\r
-\r
-                    // UTCでもなくタイムゾーンでも無い場合、ローカル時刻として設定する\r
-                    if (item.Timestamp.Value.Kind == DateTimeKind.Unspecified)\r
-                    {\r
-                        item.Timestamp = DateTime.SpecifyKind(item.Timestamp.Value, DateTimeKind.Local);\r
-                    }\r
-                }\r
-\r
-                dic[FormUtils.ToString(row.Cells["ColumnFromTitle"])] = item;\r
-            }\r
-\r
-            return dictionaries;\r
-        }\r
-        \r
-        /// <summary>\r
-        /// 記事の置き換え対訳表の行が空かを判定する。\r
-        /// </summary>\r
-        /// <param name="row">対訳表の1行。</param>\r
-        /// <returns>空の場合<c>true</c>。</returns>\r
-        private bool IsEmptyDataGridViewItemsRow(DataGridViewRow row)\r
-        {\r
-            return String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromCode"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromTitle"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnAlias"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToCode"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToTitle"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnTimestamp"]));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 見出しの置き換えタブのイベントのメソッド\r
-\r
-        /// <summary>\r
-        /// 見出しの置き換え対訳表を使用する<see cref="DataGridView"/>の値設定を行う。\r
-        /// </summary>\r
-        /// <param name="view">対訳表を表示するビュー。</param>\r
-        /// <param name="table">対訳表データ。</param>\r
-        private void ImportTranslationTableView(DataGridView view, TranslationTable table)\r
-        {\r
-            // 初期設定以外の場合も想定して最初にクリア\r
-            view.Columns.Clear();\r
-\r
-            // 言語コードを列、語句を行とする。登録されている全言語分の列を作成する\r
-            foreach (Website site in this.config.Websites)\r
-            {\r
-                this.AddTranslationTableColumn(view.Columns, site.Language.Code, this.GetHeaderLanguage(site.Language));\r
-            }\r
-\r
-            // 各行にデータを取り込み\r
-            foreach (IDictionary<string, string> record in table)\r
-            {\r
-                // 行を追加しその行を取得\r
-                DataGridViewRow row = view.Rows[view.Rows.Add()];\r
-\r
-                foreach (KeyValuePair<string, string> cell in record)\r
-                {\r
-                    // 上で登録した列では足りなかった場合、その都度生成する\r
-                    if (!view.Columns.Contains(cell.Key))\r
-                    {\r
-                        this.AddTranslationTableColumn(view.Columns, cell.Key, cell.Key);\r
-                    }\r
-\r
-                    row.Cells[cell.Key].Value = cell.Value;\r
-                }\r
-            }\r
-\r
-            // 列幅をデータ長に応じて自動調整\r
-            // ※ 常に行ってしまうと、読み込みに時間がかかるため\r
-            view.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 見出しの置き換え対訳表を使用する<see cref="DataGridView"/>からデータを抽出する。\r
-        /// </summary>\r
-        /// <param name="view">対訳表を表示するビュー。</param>\r
-        /// <returns>対訳表データ。</returns>\r
-        private TranslationTable ExportTranslationTableView(DataGridView view)\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            foreach (DataGridViewRow row in view.Rows)\r
-            {\r
-                IDictionary<string, string> record = new SortedDictionary<string, string>();\r
-                foreach (DataGridViewCell cell in row.Cells)\r
-                {\r
-                    // 空のセルは格納しない、該当の組み合わせは消える\r
-                    string value = FormUtils.ToString(cell);\r
-                    if (!String.IsNullOrWhiteSpace(value))\r
-                    {\r
-                        record[cell.OwningColumn.Name] = value;\r
-                    }\r
-                }\r
-\r
-                // 1件もデータが無い行は丸々カットする\r
-                if (record.Count > 0)\r
-                {\r
-                    table.Add(record);\r
-                }\r
-            }\r
-\r
-            return table;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定された情報を元に見出しの置き換え対訳表の列を追加する。\r
-        /// </summary>\r
-        /// <param name="columns">列コレクション。</param>\r
-        /// <param name="columnName">列名。</param>\r
-        /// <param name="headerText">列見出し。</param>\r
-        private void AddTranslationTableColumn(DataGridViewColumnCollection columns, string columnName, string headerText)\r
-        {\r
-            columns.Add(columnName, headerText);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定された言語用の表示名を返す。\r
-        /// </summary>\r
-        /// <param name="lang">表示言語コード。</param>\r
-        /// <returns>表示名、無ければ言語コード。</returns>\r
-        private string GetHeaderLanguage(Language lang)\r
-        {\r
-            Language.LanguageName name;\r
-            if (lang.Names.TryGetValue(\r
-                System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName, out name))\r
-            {\r
-                if (!String.IsNullOrEmpty(name.Name))\r
-                {\r
-                    return String.Format(Resources.HeadingViewHeaderText, name.Name, lang.Code);\r
-                }\r
-            }\r
-\r
-            return lang.Code;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 言語/サーバータブのイベントのメソッド\r
-\r
-        /// <summary>\r
-        /// 言語コンボボックス変更時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxLanguuage_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            try\r
-            {\r
-                // 変更前の設定を保存\r
-                if (!String.IsNullOrEmpty(this.comboBoxLanguageSelectedText))\r
-                {\r
-                    // 設定が存在しなければ自動生成される\r
-                    this.SaveChangedValue(this.GetMediaWikiNeedCreate(this.config.Websites, this.comboBoxLanguageSelectedText));\r
-                }\r
-\r
-                // 変更後の値に応じて、画面表示を更新\r
-                string code = ObjectUtils.ToString(this.comboBoxLanguage.SelectedItem).Trim();\r
-                if (!String.IsNullOrEmpty(code))\r
-                {\r
-                    // 設定が存在しなければ基本的に自動生成されるのでそのまま使用\r
-                    this.LoadCurrentValue(this.GetMediaWikiNeedCreate(this.config.Websites, code));\r
-\r
-                    // 各入力欄を有効に\r
-                    this.groupBoxServer.Enabled = true;\r
-                    this.groupBoxLanguage.Enabled = true;\r
-\r
-                    // 現在の選択値を更新\r
-                    this.comboBoxLanguageSelectedText = code;\r
-                }\r
-                else\r
-                {\r
-                    // 各入力欄を無効に\r
-                    this.groupBoxServer.Enabled = false;\r
-                    this.groupBoxLanguage.Enabled = false;\r
-\r
-                    // 現在の選択値を更新\r
-                    this.comboBoxLanguageSelectedText = String.Empty;\r
-                }\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                // 通常この処理では例外は発生しないはず。想定外のエラー用\r
-                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語コンボボックスキー入力時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxLanguage_KeyDown(object sender, KeyEventArgs e)\r
-        {\r
-            // エンターキーが押された場合、現在の値が一覧に無ければ登録する(フォーカスを失ったときの処理)\r
-            if (e.KeyCode == Keys.Enter)\r
-            {\r
-                System.Diagnostics.Debug.WriteLine("ComboBoxLanguage::_KeyDown > " + this.comboBoxLanguage.Text);\r
-                this.ComboBoxLanguage_Leave(sender, e);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語コンボボックスフォーカス喪失時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxLanguage_Leave(object sender, EventArgs e)\r
-        {\r
-            System.Diagnostics.Debug.WriteLine("ComboBoxLanguage::_Leave > " + this.comboBoxLanguage.Text);\r
-\r
-            this.comboBoxLanguage.Text = this.comboBoxLanguage.Text.Trim().ToLower();\r
-            if (String.IsNullOrEmpty(this.comboBoxLanguage.Text))\r
-            {\r
-                // 空にしたとき、変更でイベントが起こらないようなので、強制的に呼ぶ\r
-                this.ComboBoxLanguuage_SelectedIndexChanged(sender, e);\r
-            }\r
-            else if (!this.comboBoxLanguage.Items.Contains(this.comboBoxLanguage.Text))\r
-            {\r
-                // 現在の値が一覧に無ければ登録する\r
-                this.comboBoxLanguage.Items.Add(this.comboBoxLanguage.Text);\r
-\r
-                // 登録した場合、見出しの対訳表にも列を追加\r
-                this.dataGridViewHeading.Columns.Add(this.comboBoxLanguage.Text, this.comboBoxLanguage.Text);\r
-\r
-                // 登録した値を選択状態に変更\r
-                this.comboBoxLanguage.SelectedItem = this.comboBoxLanguage.Text;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 各名前空間のIDボックスバリデート処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void TextBoxNamespace_Validating(object sender, CancelEventArgs e)\r
-        {\r
-            // 空か数値のみ許可\r
-            TextBox box = (TextBox)sender;\r
-            box.Text = StringUtils.DefaultString(box.Text).Trim();\r
-            int value;\r
-            if (!String.IsNullOrEmpty(box.Text) && !int.TryParse(box.Text, out value))\r
-            {\r
-                this.errorProvider.SetError(box, Resources.WarningMessageIgnoreNumericNamespace);\r
-                e.Cancel = true;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語の設定表の行編集時のバリデート処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewLanguageName_RowValidating(object sender, DataGridViewCellCancelEventArgs e)\r
-        {\r
-            DataGridViewRow row = this.dataGridViewLanguageName.Rows[e.RowIndex];\r
-\r
-            // 空行(新規行など)の場合無視\r
-            if (FormUtils.IsEmptyRow(row))\r
-            {\r
-                return;\r
-            }\r
-\r
-            // 言語コードは必須、またトリムして小文字に変換\r
-            string code = FormUtils.ToString(row.Cells["ColumnCode"]).Trim().ToLower();\r
-            row.Cells["ColumnCode"].Value = code;\r
-            if (String.IsNullOrEmpty(code))\r
-            {\r
-                row.ErrorText = Resources.WarningMessageEmptyCodeColumn;\r
-                e.Cancel = true;\r
-                return;\r
-            }\r
-\r
-            // 略称を設定する場合、呼称を必須とする\r
-            if (!String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnShortName"]))\r
-                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnName"])))\r
-            {\r
-                row.ErrorText = Resources.WarningMessageShortNameColumnOnly;\r
-                e.Cancel = true;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語の設定表バリデート処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void DataGridViewLanguageName_Validating(object sender, CancelEventArgs e)\r
-        {\r
-            // 言語コードの重複チェック\r
-            IDictionary<string, int> codeMap = new Dictionary<string, int>();\r
-            for (int i = 0; i < this.dataGridViewLanguageName.RowCount - 1; i++)\r
-            {\r
-                string code = FormUtils.ToString(this.dataGridViewLanguageName["ColumnCode", i]);\r
-                int y;\r
-                if (codeMap.TryGetValue(code, out y))\r
-                {\r
-                    // 重複の場合、両方の行にエラーを設定\r
-                    this.dataGridViewLanguageName.Rows[i].ErrorText = Resources.WarningMessageDuplicateCodeColumn;\r
-                    this.dataGridViewLanguageName.Rows[y].ErrorText = Resources.WarningMessageDuplicateCodeColumn;\r
-                    e.Cancel = true;\r
-                }\r
-                else\r
-                {\r
-                    // それ以外はマップに出現行とともに追加\r
-                    codeMap[code] = i;\r
-                }\r
-            }\r
-        }\r
-\r
-        #region イベント実装支援用メソッド\r
-\r
-        /// <summary>\r
-        /// コレクションから指定された言語のMediaWikiを取得する。\r
-        /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。\r
-        /// </summary>\r
-        /// <param name="collection">翻訳元言語。</param>\r
-        /// <param name="lang">言語コード。</param>\r
-        /// <returns>翻訳パターン。存在しない場合は新たに作成した翻訳パターンを返す。</returns>\r
-        private MediaWiki GetMediaWikiNeedCreate(ICollection<Website> collection, string lang)\r
-        {\r
-            // 設定が存在すれば取得した値を返す\r
-            foreach (Website s in collection)\r
-            {\r
-                if (s.Language.Code == lang)\r
-                {\r
-                    if (s is MediaWiki)\r
-                    {\r
-                        return s as MediaWiki;\r
-                    }\r
-\r
-                    // 万が一同じ言語コードで違う型の値があったら上書き\r
-                    collection.Remove(s);\r
-                    break;\r
-                }\r
-            }\r
-\r
-            // 存在しないか上書きの場合、作成した翻訳パターンをコレクションに追加し、返す\r
-            MediaWiki site = new MediaWiki(new Language(lang));\r
-            collection.Add(site);\r
-            return site;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたLanguage設定を画面表示/編集用に読み込む。\r
-        /// </summary>\r
-        /// <param name="lang">読込元Language設定。</param>\r
-        /// <remarks>一部パラメータには初期値が存在するが、格納時に対処するため全て読み込む。</remarks>\r
-        private void LoadCurrentValue(Language lang)\r
-        {\r
-            // 言語情報を読み込み\r
-            // ※ Bracketは初期値があるパラメータのため、必ず値が返る\r
-            this.textBoxBracket.Text = lang.Bracket;\r
-\r
-            // 呼称の情報を表に設定\r
-            this.dataGridViewLanguageName.Rows.Clear();\r
-            foreach (KeyValuePair<string, Language.LanguageName> name in lang.Names)\r
-            {\r
-                int index = this.dataGridViewLanguageName.Rows.Add();\r
-                this.dataGridViewLanguageName["ColumnCode", index].Value = name.Key;\r
-                this.dataGridViewLanguageName["ColumnName", index].Value = name.Value.Name;\r
-                this.dataGridViewLanguageName["ColumnShortName", index].Value = name.Value.ShortName;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたWebsite設定を画面表示/編集用に読み込む。\r
-        /// </summary>\r
-        /// <param name="site">読込元Website設定。</param>\r
-        private void LoadCurrentValue(Website site)\r
-        {\r
-            // Languageクラス分の読み込みを行う\r
-            this.LoadCurrentValue(site.Language);\r
-\r
-            // サイト情報を読み込み\r
-            this.textBoxLocation.Text = site.Location;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたMediaWiki設定を画面表示/編集用に読み込む。\r
-        /// </summary>\r
-        /// <param name="site">読込元MediaWiki設定。</param>\r
-        /// <remarks>一部パラメータには初期値が存在するが、格納時に対処するため全て読み込む。</remarks>\r
-        private void LoadCurrentValue(MediaWiki site)\r
-        {\r
-            // Websiteクラス分の読み込みを行う\r
-            this.LoadCurrentValue((Website)site);\r
-\r
-            // MediaWikiクラス分の読み込み\r
-            this.textBoxExportPath.Text = StringUtils.DefaultString(site.ExportPath);\r
-            this.textBoxNamespacePath.Text = StringUtils.DefaultString(site.NamespacePath);\r
-            this.textBoxTemplateNamespace.Text = site.TemplateNamespace.ToString();\r
-            this.textBoxCategoryNamespace.Text = site.CategoryNamespace.ToString();\r
-            this.textBoxFileNamespace.Text = site.FileNamespace.ToString();\r
-            this.textBoxRedirect.Text = StringUtils.DefaultString(site.Redirect);\r
-            this.textBoxDocumentationTemplate.Text = StringUtils.DefaultString(site.DocumentationTemplate);\r
-            this.textBoxDocumentationTemplateDefaultPage.Text = StringUtils.DefaultString(site.DocumentationTemplateDefaultPage);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたLanguage設定に画面上で変更された値の格納を行う。\r
-        /// </summary>\r
-        /// <param name="lang">格納先Language設定。</param>\r
-        /// <remarks>一部パラメータには初期値が存在するため、変更がある場合のみ格納する。</remarks>\r
-        private void SaveChangedValue(Language lang)\r
-        {\r
-            // Bracketは初期値を持つパラメータのため、変更された場合のみ格納する。\r
-            // ※ この値は前後の空白に意味があるため、Trimしてはいけない\r
-            string str = StringUtils.DefaultString(this.textBoxBracket.Text);\r
-            if (str != lang.Bracket)\r
-            {\r
-                lang.Bracket = str;\r
-            }\r
-\r
-            // 表から呼称の情報も保存\r
-            this.dataGridViewLanguageName.Sort(this.dataGridViewLanguageName.Columns["ColumnCode"], ListSortDirection.Ascending);\r
-            lang.Names.Clear();\r
-            for (int y = 0; y < this.dataGridViewLanguageName.RowCount - 1; y++)\r
-            {\r
-                // 値が入ってないとかはガードしているはずだが、一応チェック\r
-                string code = FormUtils.ToString(this.dataGridViewLanguageName["ColumnCode", y]).Trim();\r
-                if (!String.IsNullOrEmpty(code))\r
-                {\r
-                    Language.LanguageName name = new Language.LanguageName();\r
-                    name.Name = FormUtils.ToString(this.dataGridViewLanguageName["ColumnName", y]).Trim();\r
-                    name.ShortName = FormUtils.ToString(this.dataGridViewLanguageName["ColumnShortName", y]).Trim();\r
-                    lang.Names[code] = name;\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたWebsite設定に画面上で変更された値の格納を行う。\r
-        /// </summary>\r
-        /// <param name="site">格納先Website設定。</param>\r
-        /// <remarks>Websiteについては特に特殊な処理は無いため全て上書きする。</remarks>\r
-        private void SaveChangedValue(Website site)\r
-        {\r
-            // Languageクラス分の設定を行う\r
-            this.SaveChangedValue(site.Language);\r
-\r
-            // サイト情報を格納\r
-            site.Location = StringUtils.DefaultString(this.textBoxLocation.Text).Trim();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたMediaWiki設定に画面上で変更された値の格納を行う。\r
-        /// </summary>\r
-        /// <param name="site">格納先MediaWiki設定。</param>\r
-        /// <remarks>一部パラメータには初期値が存在するため、変更がある場合のみ格納する。</remarks>\r
-        private void SaveChangedValue(MediaWiki site)\r
-        {\r
-            // Websiteクラス分の設定を行う\r
-            this.SaveChangedValue((Website)site);\r
-\r
-            // 初期値を持つパラメータがあるため、全て変更された場合のみ格納する。\r
-            // ※ もうちょっと綺麗に書きたかったが、リフレクションを使わないと共通化できなさそうだったので力技\r
-            //    MediaWikiクラス側で行わないのは、場合によっては意図的に初期値と同じ値を設定すること\r
-            //    もありえるから(初期値が変わる可能性がある場合など)。\r
-            string str = StringUtils.DefaultString(this.textBoxExportPath.Text).Trim();\r
-            if (str != site.ExportPath)\r
-            {\r
-                site.ExportPath = str;\r
-            }\r
-            \r
-            str = StringUtils.DefaultString(this.textBoxNamespacePath.Text).Trim();\r
-            if (str != site.NamespacePath)\r
-            {\r
-                site.NamespacePath = str;\r
-            }\r
-\r
-            str = StringUtils.DefaultString(this.textBoxRedirect.Text).Trim();\r
-            if (str != site.Redirect)\r
-            {\r
-                site.Redirect = str;\r
-            }\r
-\r
-            str = StringUtils.DefaultString(this.textBoxDocumentationTemplate.Text).Trim();\r
-            if (str != site.DocumentationTemplate)\r
-            {\r
-                site.DocumentationTemplate = str;\r
-            }\r
-\r
-            str = StringUtils.DefaultString(this.textBoxDocumentationTemplateDefaultPage.Text).Trim();\r
-            if (str != site.DocumentationTemplateDefaultPage)\r
-            {\r
-                site.DocumentationTemplateDefaultPage = str;\r
-            }\r
-\r
-            // 以下、数値へのparseは事前にチェックしてあるので、ここではチェックしない\r
-            if (!String.IsNullOrWhiteSpace(this.textBoxTemplateNamespace.Text))\r
-            {\r
-                int num = int.Parse(this.textBoxTemplateNamespace.Text);\r
-                if (site.TemplateNamespace != num)\r
-                {\r
-                    site.TemplateNamespace = num;\r
-                }\r
-            }\r
-\r
-            if (!String.IsNullOrWhiteSpace(this.textBoxCategoryNamespace.Text))\r
-            {\r
-                int num = int.Parse(this.textBoxCategoryNamespace.Text);\r
-                if (site.CategoryNamespace != num)\r
-                {\r
-                    site.CategoryNamespace = num;\r
-                }\r
-            }\r
-\r
-            if (!String.IsNullOrWhiteSpace(this.textBoxFileNamespace.Text))\r
-            {\r
-                int num = int.Parse(this.textBoxFileNamespace.Text);\r
-                if (site.FileNamespace != num)\r
-                {\r
-                    site.FileNamespace = num;\r
-                }\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #endregion\r
-\r
-        #region その他タブのイベントのメソッド\r
-        \r
-        /// <summary>\r
-        /// キャッシュ有効期限ボックスバリデート処理。。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void TextBoxCacheExpire_Validating(object sender, CancelEventArgs e)\r
-        {\r
-            TextBox box = (TextBox)sender;\r
-            box.Text = StringUtils.DefaultString(box.Text).Trim();\r
-            int expire;\r
-            if (!int.TryParse(box.Text, out expire) || expire < 0)\r
-            {\r
-                this.errorProvider.SetError(box, Resources.WarningMessageIgnoreCacheExpire);\r
-                e.Cancel = true;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ウェブサイトURLクリック時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void LinkLabelWebsite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
-        {\r
-            // リンクを開く\r
-            System.Diagnostics.Process.Start(((LinkLabel)sender).Text);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 共通のイベントメソッド\r
-        \r
-        /// <summary>\r
-        /// 汎用のエラープロバイダ初期化処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ResetErrorProvider_Validated(object sender, EventArgs e)\r
-        {\r
-            this.errorProvider.SetError((Control)sender, null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 汎用の行編集時のエラーテキスト初期化処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ResetErrorText_RowValidated(object sender, DataGridViewCellEventArgs e)\r
-        {\r
-            ((DataGridView)sender).Rows[e.RowIndex].ErrorText = String.Empty;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 汎用のテーブルエラーテキスト初期化処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ResetErrorText_Validated(object sender, EventArgs e)\r
-        {\r
-            // 全行のエラーメッセージを解除\r
-            foreach (DataGridViewRow row in ((DataGridView)sender).Rows)\r
-            {\r
-                row.ErrorText = String.Empty;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部クラス\r
-\r
-        /// <summary>\r
-        /// 記事の置き換え対訳表の日付並び替え用クラスです。\r
-        /// </summary>\r
-        /// <remarks>取得日時の降順でソート、空の列は先頭にします。</remarks>\r
-        public class TranslationDictionaryViewComparer : System.Collections.IComparer\r
-        {\r
-            /// <summary>\r
-            /// 2行を比較し、一方が他方より小さいか、等しいか、大きいかを示す値を返します。\r
-            /// </summary>\r
-            /// <param name="y">比較する最初の行です。</param>\r
-            /// <param name="x">比較する 2 番目の行。</param>\r
-            /// <returns>1以下:xはyより小さい, 0:等しい, 1以上:xはyより大きい</returns>\r
-            public int Compare(object y, object x)\r
-            {\r
-                string xstr = ObjectUtils.ToString(((DataGridViewRow)x).Cells["ColumnTimestamp"].Value);\r
-                string ystr = ObjectUtils.ToString(((DataGridViewRow)y).Cells["ColumnTimestamp"].Value);\r
-                if (String.IsNullOrWhiteSpace(xstr) && String.IsNullOrWhiteSpace(ystr))\r
-                {\r
-                    return 0;\r
-                }\r
-                else if (String.IsNullOrWhiteSpace(xstr))\r
-                {\r
-                    return 1;\r
-                }\r
-                else if (String.IsNullOrWhiteSpace(ystr))\r
-                {\r
-                    return -1;\r
-                }\r
-\r
-                return xstr.CompareTo(ystr);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Wikipedia翻訳支援ツール設定画面クラスソース</summary>
+//
+// <copyright file="ConfigForm.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs
+{
+    using System;
+    using System.Collections.Generic;
+    using System.ComponentModel;
+    using System.Data;
+    using System.Drawing;
+    using System.Reflection;
+    using System.Text;
+    using System.Windows.Forms;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Models;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// Wikipedia翻訳支援ツール設定画面のクラスです。
+    /// </summary>
+    public partial class ConfigForm : Form
+    {
+        #region private変数
+
+        /// <summary>
+        /// 現在設定中のアプリケーションの設定。
+        /// </summary>
+        /// <remarks>設定画面を閉じた後は再読み込みされるので、必要に応じて随時更新してよい。</remarks>
+        private Config config;
+
+        /// <summary>
+        /// <seealso cref="comboBoxLanguage"/>で選択していたアイテムのバックアップ。
+        /// </summary>
+        private string comboBoxLanguageSelectedText;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ。
+        /// </summary>
+        /// <param name="config">設定対象のConfig。</param>
+        /// <remarks>configは設定画面の操作により随時更新される。呼び出し元では再読み込みすること。</remarks>
+        public ConfigForm(Config config)
+        {
+            this.InitializeComponent();
+
+            // 設定対象のConfigを受け取る
+            this.config = Utilities.Validate.NotNull(config, "config");
+        }
+
+        #endregion
+        
+        #region フォームの各イベントのメソッド
+
+        /// <summary>
+        /// フォームロード時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ConfigForm_Load(object sender, EventArgs e)
+        {
+            try
+            {
+                // 各タブの内容を初期化する
+
+                // 記事の置き換えタブの初期化
+                this.ImportTranslationDictionaryView(this.dataGridViewItems, this.config.ItemTables);
+
+                // 見出しの置き換えタブの初期化
+                this.ImportTranslationTableView(this.dataGridViewHeading, this.config.HeadingTable);
+
+                // サーバー/言語タブの初期化
+                foreach (Website site in this.config.Websites)
+                {
+                    this.comboBoxLanguage.Items.Add(site.Language.Code);
+                }
+
+                // その他タブの初期化
+                this.textBoxCacheExpire.Text = Settings.Default.CacheExpire.Days.ToString();
+                this.textBoxUserAgent.Text = Settings.Default.UserAgent;
+                this.textBoxReferer.Text = Settings.Default.Referer;
+                this.checkBoxIgnoreError.Checked = Settings.Default.IgnoreError;
+                this.labelApplicationName.Text = FormUtils.ApplicationName();
+                AssemblyCopyrightAttribute copyright = Attribute.GetCustomAttribute(
+                    Assembly.GetExecutingAssembly(),
+                    typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute;
+                if (copyright != null)
+                {
+                    this.labelCopyright.Text = copyright.Copyright;
+                }
+            }
+            catch (Exception ex)
+            {
+                // 通常この処理では例外は発生しないはず(Configに読めているので)。想定外のエラー用
+                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);
+            }
+        }
+
+        /// <summary>
+        /// OKボタン押下時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ButtonOk_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                // 各タブの内容を設定ファイルに保存する
+
+                // 記事の置き換えタブの保存
+                this.config.ItemTables = this.ExportTranslationDictionaryView(this.dataGridViewItems);
+
+                // 見出しの置き換えタブの保存
+                this.config.HeadingTable = this.ExportTranslationTableView(this.dataGridViewHeading);
+
+                // サーバー/言語タブの保存
+                // ※ このタブはコンボボックス変更のタイミングで保存されるので、そのメソッドを呼ぶ
+                this.ComboBoxLanguuage_SelectedIndexChanged(sender, e);
+
+                // その他タブの保存
+                Settings.Default.CacheExpire = new TimeSpan(int.Parse(this.textBoxCacheExpire.Text), 0, 0, 0);
+                Settings.Default.UserAgent = this.textBoxUserAgent.Text;
+                Settings.Default.Referer = this.textBoxReferer.Text;
+                Settings.Default.IgnoreError = this.checkBoxIgnoreError.Checked;
+
+                // 設定をファイルに保存
+                Settings.Default.Save();
+                try
+                {
+                    this.config.Save(Settings.Default.ConfigurationFile);
+
+                    // 全部成功なら画面を閉じる
+                    // ※ エラーの場合、どうしても駄目ならキャンセルボタンで閉じてもらう
+                    this.Close();
+                }
+                catch (Exception ex)
+                {
+                    // 異常時はエラーメッセージを表示
+                    // ※ この場合でもConfigオブジェクトは更新済みのため設定は一時的に有効
+                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
+                    FormUtils.ErrorDialog(Resources.ErrorMessageConfigSaveFailed, ex.Message);
+                }
+            }
+            catch (Exception ex)
+            {
+                // 通常ファイル保存以外では例外は発生しないはず。想定外のエラー用
+                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);
+            }
+        }
+
+        #endregion
+
+        #region 記事の置き換えタブのイベントのメソッド
+
+        /// <summary>
+        /// 記事の置き換え対訳表への行追加時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewItems_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
+        {
+            for (int i = e.RowIndex - 1; i < this.dataGridViewItems.Rows.Count; i++)
+            {
+                // プログラムから追加された場合は現在のインデックス、画面から追加した場合は+1したインデックスが来る
+                if (i >= 0)
+                {
+                    this.dataGridViewItems.Rows[i].Cells["ColumnArrow"].Value = Resources.RightArrow;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表のセル編集時のバリデート処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewItems_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
+        {
+            // 取得日時列のみチェック
+            if (this.dataGridViewItems.Columns[e.ColumnIndex].Name != "ColumnTimestamp")
+            {
+                return;
+            }
+
+            // 空または日付として認識可能な値の場合OK
+            string value = e.FormattedValue.ToString();
+            DateTime dummy;
+            if (String.IsNullOrWhiteSpace(value) || DateTime.TryParse(value, out dummy))
+            {
+                return;
+            }
+
+            // 不許可値の場合、NGメッセージを表示
+            this.dataGridViewItems.Rows[e.RowIndex].ErrorText = Resources.WarningMessageUnformatedTimestamp;
+            e.Cancel = true;
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表のセル編集時のバリデート成功時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewItems_CellValidated(object sender, DataGridViewCellEventArgs e)
+        {
+            // 取得日時列の場合、バリデートNGメッセージを消す
+            // ※ 他の列で消さないのは、エラーを出しているのがRowValidatingの場合もあるから
+            if (this.dataGridViewItems.Columns[e.ColumnIndex].Name == "ColumnTimestamp")
+            {
+                this.dataGridViewItems.Rows[e.RowIndex].ErrorText = String.Empty;
+            }
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表のセル変更時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewItems_CellValueChanged(object sender, DataGridViewCellEventArgs e)
+        {
+            // 取得日時列が空の場合、有効期限が無期限として背景色を変更
+            // ※ ただし全列が空(新規行など)の場合は無視
+            if (e.RowIndex >= 0)
+            {
+                string value = FormUtils.ToString(this.dataGridViewItems["ColumnTimestamp", e.RowIndex]);
+                if (String.IsNullOrWhiteSpace(value)
+                    && !this.IsEmptyDataGridViewItemsRow(this.dataGridViewItems.Rows[e.RowIndex]))
+                {
+                    this.dataGridViewItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Bisque;
+                }
+                else
+                {
+                    this.dataGridViewItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = this.dataGridViewItems.DefaultCellStyle.BackColor;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表の行編集時のバリデート処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewItems_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
+        {
+            // 翻訳元、記事名、翻訳先が未入力の場合、バリデートNGメッセージを表示
+            // ※ ただし全列が空(新規行など)の場合は無視
+            DataGridViewRow row = this.dataGridViewItems.Rows[e.RowIndex];
+            if ((String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromCode"]))
+                || String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToCode"]))
+                || String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromTitle"])))
+                && !this.IsEmptyDataGridViewItemsRow(row))
+            {
+                row.ErrorText = Resources.WarningMessageEmptyTranslationDictionary;
+                e.Cancel = true;
+            }
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表を使用する<see cref="DataGridView"/>の値設定を行う。
+        /// </summary>
+        /// <param name="view">対訳表を表示するビュー。</param>
+        /// <param name="dictionaries">対訳表データ。</param>
+        private void ImportTranslationDictionaryView(DataGridView view, IList<TranslationDictionary> dictionaries)
+        {
+            // 初期設定以外の場合も想定して最初にクリア
+            view.Rows.Clear();
+            foreach (TranslationDictionary dic in dictionaries)
+            {
+                foreach (KeyValuePair<string, TranslationDictionary.Item> item in dic)
+                {
+                    // 行を追加しその行を取得
+                    DataGridViewRow row = view.Rows[view.Rows.Add()];
+
+                    // 1行分の初期値を設定。右矢印は別途イベントで追加すること
+                    row.Cells["ColumnFromCode"].Value = dic.From;
+                    row.Cells["ColumnFromTitle"].Value = item.Key;
+                    row.Cells["ColumnAlias"].Value = item.Value.Alias;
+                    row.Cells["ColumnToCode"].Value = dic.To;
+                    row.Cells["ColumnToTitle"].Value = item.Value.Word;
+                    if (item.Value.Timestamp.HasValue)
+                    {
+                        row.Cells["ColumnTimestamp"].Value = item.Value.Timestamp.Value.ToLocalTime().ToString("G");
+                    }
+                }
+            }
+
+            // 取得日時の降順でソート、空の列は先頭にする
+            this.dataGridViewItems.Sort(new TranslationDictionaryViewComparer());
+
+            // 列幅をデータ長に応じて自動調整
+            // ※ 常に行ってしまうと、読み込みに非常に時間がかかるため
+            view.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
+        }
+
+        /// <summary>
+        /// 記事の置き換え対訳表を使用する<see cref="DataGridView"/>からデータを抽出する。
+        /// </summary>
+        /// <param name="view">対訳表を表示するビュー。</param>
+        /// <returns>対訳表データ。</returns>
+        private IList<TranslationDictionary> ExportTranslationDictionaryView(DataGridView view)
+        {
+            IList<TranslationDictionary> dictionaries = new List<TranslationDictionary>();
+            foreach (DataGridViewRow row in view.Rows)
+            {
+                // 画面での追加用の最終行が空で渡されてくるので無視
+                if (this.IsEmptyDataGridViewItemsRow(row))
+                {
+                    continue;
+                }
+
+                // その行で対象とする言語を探索、無ければ新規作成
+                string from = FormUtils.ToString(row.Cells["ColumnFromCode"]);
+                string to = FormUtils.ToString(row.Cells["ColumnToCode"]);
+                TranslationDictionary dic
+                    = TranslationDictionary.GetDictionaryNeedCreate(dictionaries, from, to);
+
+                // 値を格納
+                TranslationDictionary.Item item = new TranslationDictionary.Item
+                {
+                    Word = FormUtils.ToString(row.Cells["ColumnToTitle"]),
+                    Alias = FormUtils.ToString(row.Cells["ColumnAlias"])
+                };
+
+                string timestamp = FormUtils.ToString(row.Cells["ColumnTimestamp"]);
+                if (!String.IsNullOrWhiteSpace(timestamp))
+                {
+                    item.Timestamp = DateTime.Parse(timestamp);
+
+                    // UTCでもなくタイムゾーンでも無い場合、ローカル時刻として設定する
+                    if (item.Timestamp.Value.Kind == DateTimeKind.Unspecified)
+                    {
+                        item.Timestamp = DateTime.SpecifyKind(item.Timestamp.Value, DateTimeKind.Local);
+                    }
+                }
+
+                dic[FormUtils.ToString(row.Cells["ColumnFromTitle"])] = item;
+            }
+
+            return dictionaries;
+        }
+        
+        /// <summary>
+        /// 記事の置き換え対訳表の行が空かを判定する。
+        /// </summary>
+        /// <param name="row">対訳表の1行。</param>
+        /// <returns>空の場合<c>true</c>。</returns>
+        private bool IsEmptyDataGridViewItemsRow(DataGridViewRow row)
+        {
+            return String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromCode"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnFromTitle"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnAlias"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToCode"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnToTitle"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnTimestamp"]));
+        }
+
+        #endregion
+
+        #region 見出しの置き換えタブのイベントのメソッド
+
+        /// <summary>
+        /// 見出しの置き換え対訳表を使用する<see cref="DataGridView"/>の値設定を行う。
+        /// </summary>
+        /// <param name="view">対訳表を表示するビュー。</param>
+        /// <param name="table">対訳表データ。</param>
+        private void ImportTranslationTableView(DataGridView view, TranslationTable table)
+        {
+            // 初期設定以外の場合も想定して最初にクリア
+            view.Columns.Clear();
+
+            // 言語コードを列、語句を行とする。登録されている全言語分の列を作成する
+            foreach (Website site in this.config.Websites)
+            {
+                this.AddTranslationTableColumn(view.Columns, site.Language.Code, this.GetHeaderLanguage(site.Language));
+            }
+
+            // 各行にデータを取り込み
+            foreach (IDictionary<string, string> record in table)
+            {
+                // 行を追加しその行を取得
+                DataGridViewRow row = view.Rows[view.Rows.Add()];
+
+                foreach (KeyValuePair<string, string> cell in record)
+                {
+                    // 上で登録した列では足りなかった場合、その都度生成する
+                    if (!view.Columns.Contains(cell.Key))
+                    {
+                        this.AddTranslationTableColumn(view.Columns, cell.Key, cell.Key);
+                    }
+
+                    row.Cells[cell.Key].Value = cell.Value;
+                }
+            }
+
+            // 列幅をデータ長に応じて自動調整
+            // ※ 常に行ってしまうと、読み込みに時間がかかるため
+            view.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
+        }
+
+        /// <summary>
+        /// 見出しの置き換え対訳表を使用する<see cref="DataGridView"/>からデータを抽出する。
+        /// </summary>
+        /// <param name="view">対訳表を表示するビュー。</param>
+        /// <returns>対訳表データ。</returns>
+        private TranslationTable ExportTranslationTableView(DataGridView view)
+        {
+            TranslationTable table = new TranslationTable();
+            foreach (DataGridViewRow row in view.Rows)
+            {
+                IDictionary<string, string> record = new SortedDictionary<string, string>();
+                foreach (DataGridViewCell cell in row.Cells)
+                {
+                    // 空のセルは格納しない、該当の組み合わせは消える
+                    string value = FormUtils.ToString(cell);
+                    if (!String.IsNullOrWhiteSpace(value))
+                    {
+                        record[cell.OwningColumn.Name] = value;
+                    }
+                }
+
+                // 1件もデータが無い行は丸々カットする
+                if (record.Count > 0)
+                {
+                    table.Add(record);
+                }
+            }
+
+            return table;
+        }
+
+        /// <summary>
+        /// 指定された情報を元に見出しの置き換え対訳表の列を追加する。
+        /// </summary>
+        /// <param name="columns">列コレクション。</param>
+        /// <param name="columnName">列名。</param>
+        /// <param name="headerText">列見出し。</param>
+        private void AddTranslationTableColumn(DataGridViewColumnCollection columns, string columnName, string headerText)
+        {
+            columns.Add(columnName, headerText);
+        }
+
+        /// <summary>
+        /// 指定された言語用の表示名を返す。
+        /// </summary>
+        /// <param name="lang">表示言語コード。</param>
+        /// <returns>表示名、無ければ言語コード。</returns>
+        private string GetHeaderLanguage(Language lang)
+        {
+            Language.LanguageName name;
+            if (lang.Names.TryGetValue(
+                System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName, out name))
+            {
+                if (!String.IsNullOrEmpty(name.Name))
+                {
+                    return String.Format(Resources.HeadingViewHeaderText, name.Name, lang.Code);
+                }
+            }
+
+            return lang.Code;
+        }
+
+        #endregion
+
+        #region 言語/サーバータブのイベントのメソッド
+
+        /// <summary>
+        /// 言語コンボボックス変更時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxLanguuage_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            try
+            {
+                // 変更前の設定を保存
+                if (!String.IsNullOrEmpty(this.comboBoxLanguageSelectedText))
+                {
+                    // 設定が存在しなければ自動生成される
+                    this.SaveChangedValue(this.GetMediaWikiNeedCreate(this.config.Websites, this.comboBoxLanguageSelectedText));
+                }
+
+                // 変更後の値に応じて、画面表示を更新
+                string code = ObjectUtils.ToString(this.comboBoxLanguage.SelectedItem).Trim();
+                if (!String.IsNullOrEmpty(code))
+                {
+                    // 設定が存在しなければ基本的に自動生成されるのでそのまま使用
+                    this.LoadCurrentValue(this.GetMediaWikiNeedCreate(this.config.Websites, code));
+
+                    // 各入力欄を有効に
+                    this.groupBoxServer.Enabled = true;
+                    this.groupBoxLanguage.Enabled = true;
+
+                    // 現在の選択値を更新
+                    this.comboBoxLanguageSelectedText = code;
+                }
+                else
+                {
+                    // 各入力欄を無効に
+                    this.groupBoxServer.Enabled = false;
+                    this.groupBoxLanguage.Enabled = false;
+
+                    // 現在の選択値を更新
+                    this.comboBoxLanguageSelectedText = String.Empty;
+                }
+            }
+            catch (Exception ex)
+            {
+                // 通常この処理では例外は発生しないはず。想定外のエラー用
+                FormUtils.ErrorDialog(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace);
+            }
+        }
+
+        /// <summary>
+        /// 言語コンボボックスキー入力時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxLanguage_KeyDown(object sender, KeyEventArgs e)
+        {
+            // エンターキーが押された場合、現在の値が一覧に無ければ登録する(フォーカスを失ったときの処理)
+            if (e.KeyCode == Keys.Enter)
+            {
+                System.Diagnostics.Debug.WriteLine("ComboBoxLanguage::_KeyDown > " + this.comboBoxLanguage.Text);
+                this.ComboBoxLanguage_Leave(sender, e);
+            }
+        }
+
+        /// <summary>
+        /// 言語コンボボックスフォーカス喪失時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxLanguage_Leave(object sender, EventArgs e)
+        {
+            System.Diagnostics.Debug.WriteLine("ComboBoxLanguage::_Leave > " + this.comboBoxLanguage.Text);
+
+            this.comboBoxLanguage.Text = this.comboBoxLanguage.Text.Trim().ToLower();
+            if (String.IsNullOrEmpty(this.comboBoxLanguage.Text))
+            {
+                // 空にしたとき、変更でイベントが起こらないようなので、強制的に呼ぶ
+                this.ComboBoxLanguuage_SelectedIndexChanged(sender, e);
+            }
+            else if (!this.comboBoxLanguage.Items.Contains(this.comboBoxLanguage.Text))
+            {
+                // 現在の値が一覧に無ければ登録する
+                this.comboBoxLanguage.Items.Add(this.comboBoxLanguage.Text);
+
+                // 登録した場合、見出しの対訳表にも列を追加
+                this.dataGridViewHeading.Columns.Add(this.comboBoxLanguage.Text, this.comboBoxLanguage.Text);
+
+                // 登録した値を選択状態に変更
+                this.comboBoxLanguage.SelectedItem = this.comboBoxLanguage.Text;
+            }
+        }
+
+        /// <summary>
+        /// 各名前空間のIDボックスバリデート処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void TextBoxNamespace_Validating(object sender, CancelEventArgs e)
+        {
+            // 空か数値のみ許可
+            TextBox box = (TextBox)sender;
+            box.Text = StringUtils.DefaultString(box.Text).Trim();
+            int value;
+            if (!String.IsNullOrEmpty(box.Text) && !int.TryParse(box.Text, out value))
+            {
+                this.errorProvider.SetError(box, Resources.WarningMessageIgnoreNumericNamespace);
+                e.Cancel = true;
+            }
+        }
+
+        /// <summary>
+        /// 言語の設定表の行編集時のバリデート処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewLanguageName_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
+        {
+            DataGridViewRow row = this.dataGridViewLanguageName.Rows[e.RowIndex];
+
+            // 空行(新規行など)の場合無視
+            if (FormUtils.IsEmptyRow(row))
+            {
+                return;
+            }
+
+            // 言語コードは必須、またトリムして小文字に変換
+            string code = FormUtils.ToString(row.Cells["ColumnCode"]).Trim().ToLower();
+            row.Cells["ColumnCode"].Value = code;
+            if (String.IsNullOrEmpty(code))
+            {
+                row.ErrorText = Resources.WarningMessageEmptyCodeColumn;
+                e.Cancel = true;
+                return;
+            }
+
+            // 略称を設定する場合、呼称を必須とする
+            if (!String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnShortName"]))
+                && String.IsNullOrWhiteSpace(FormUtils.ToString(row.Cells["ColumnName"])))
+            {
+                row.ErrorText = Resources.WarningMessageShortNameColumnOnly;
+                e.Cancel = true;
+            }
+        }
+
+        /// <summary>
+        /// 言語の設定表バリデート処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void DataGridViewLanguageName_Validating(object sender, CancelEventArgs e)
+        {
+            // 言語コードの重複チェック
+            IDictionary<string, int> codeMap = new Dictionary<string, int>();
+            for (int i = 0; i < this.dataGridViewLanguageName.RowCount - 1; i++)
+            {
+                string code = FormUtils.ToString(this.dataGridViewLanguageName["ColumnCode", i]);
+                int y;
+                if (codeMap.TryGetValue(code, out y))
+                {
+                    // 重複の場合、両方の行にエラーを設定
+                    this.dataGridViewLanguageName.Rows[i].ErrorText = Resources.WarningMessageDuplicateCodeColumn;
+                    this.dataGridViewLanguageName.Rows[y].ErrorText = Resources.WarningMessageDuplicateCodeColumn;
+                    e.Cancel = true;
+                }
+                else
+                {
+                    // それ以外はマップに出現行とともに追加
+                    codeMap[code] = i;
+                }
+            }
+        }
+
+        #region イベント実装支援用メソッド
+
+        /// <summary>
+        /// コレクションから指定された言語のMediaWikiを取得する。
+        /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。
+        /// </summary>
+        /// <param name="collection">翻訳元言語。</param>
+        /// <param name="lang">言語コード。</param>
+        /// <returns>翻訳パターン。存在しない場合は新たに作成した翻訳パターンを返す。</returns>
+        private MediaWiki GetMediaWikiNeedCreate(ICollection<Website> collection, string lang)
+        {
+            // 設定が存在すれば取得した値を返す
+            foreach (Website s in collection)
+            {
+                if (s.Language.Code == lang)
+                {
+                    if (s is MediaWiki)
+                    {
+                        return s as MediaWiki;
+                    }
+
+                    // 万が一同じ言語コードで違う型の値があったら上書き
+                    collection.Remove(s);
+                    break;
+                }
+            }
+
+            // 存在しないか上書きの場合、作成した翻訳パターンをコレクションに追加し、返す
+            MediaWiki site = new MediaWiki(new Language(lang));
+            collection.Add(site);
+            return site;
+        }
+
+        /// <summary>
+        /// 指定されたLanguage設定を画面表示/編集用に読み込む。
+        /// </summary>
+        /// <param name="lang">読込元Language設定。</param>
+        /// <remarks>一部パラメータには初期値が存在するが、格納時に対処するため全て読み込む。</remarks>
+        private void LoadCurrentValue(Language lang)
+        {
+            // 言語情報を読み込み
+            // ※ Bracketは初期値があるパラメータのため、必ず値が返る
+            this.textBoxBracket.Text = lang.Bracket;
+
+            // 呼称の情報を表に設定
+            this.dataGridViewLanguageName.Rows.Clear();
+            foreach (KeyValuePair<string, Language.LanguageName> name in lang.Names)
+            {
+                int index = this.dataGridViewLanguageName.Rows.Add();
+                this.dataGridViewLanguageName["ColumnCode", index].Value = name.Key;
+                this.dataGridViewLanguageName["ColumnName", index].Value = name.Value.Name;
+                this.dataGridViewLanguageName["ColumnShortName", index].Value = name.Value.ShortName;
+            }
+        }
+
+        /// <summary>
+        /// 指定されたWebsite設定を画面表示/編集用に読み込む。
+        /// </summary>
+        /// <param name="site">読込元Website設定。</param>
+        private void LoadCurrentValue(Website site)
+        {
+            // Languageクラス分の読み込みを行う
+            this.LoadCurrentValue(site.Language);
+
+            // サイト情報を読み込み
+            this.textBoxLocation.Text = site.Location;
+        }
+
+        /// <summary>
+        /// 指定されたMediaWiki設定を画面表示/編集用に読み込む。
+        /// </summary>
+        /// <param name="site">読込元MediaWiki設定。</param>
+        /// <remarks>一部パラメータには初期値が存在するが、格納時に対処するため全て読み込む。</remarks>
+        private void LoadCurrentValue(MediaWiki site)
+        {
+            // Websiteクラス分の読み込みを行う
+            this.LoadCurrentValue((Website)site);
+
+            // MediaWikiクラス分の読み込み
+            this.textBoxExportPath.Text = StringUtils.DefaultString(site.ExportPath);
+            this.textBoxNamespacePath.Text = StringUtils.DefaultString(site.NamespacePath);
+            this.textBoxTemplateNamespace.Text = site.TemplateNamespace.ToString();
+            this.textBoxCategoryNamespace.Text = site.CategoryNamespace.ToString();
+            this.textBoxFileNamespace.Text = site.FileNamespace.ToString();
+            this.textBoxRedirect.Text = StringUtils.DefaultString(site.Redirect);
+            this.textBoxDocumentationTemplate.Text = StringUtils.DefaultString(site.DocumentationTemplate);
+            this.textBoxDocumentationTemplateDefaultPage.Text = StringUtils.DefaultString(site.DocumentationTemplateDefaultPage);
+        }
+
+        /// <summary>
+        /// 指定されたLanguage設定に画面上で変更された値の格納を行う。
+        /// </summary>
+        /// <param name="lang">格納先Language設定。</param>
+        /// <remarks>一部パラメータには初期値が存在するため、変更がある場合のみ格納する。</remarks>
+        private void SaveChangedValue(Language lang)
+        {
+            // Bracketは初期値を持つパラメータのため、変更された場合のみ格納する。
+            // ※ この値は前後の空白に意味があるため、Trimしてはいけない
+            string str = StringUtils.DefaultString(this.textBoxBracket.Text);
+            if (str != lang.Bracket)
+            {
+                lang.Bracket = str;
+            }
+
+            // 表から呼称の情報も保存
+            this.dataGridViewLanguageName.Sort(this.dataGridViewLanguageName.Columns["ColumnCode"], ListSortDirection.Ascending);
+            lang.Names.Clear();
+            for (int y = 0; y < this.dataGridViewLanguageName.RowCount - 1; y++)
+            {
+                // 値が入ってないとかはガードしているはずだが、一応チェック
+                string code = FormUtils.ToString(this.dataGridViewLanguageName["ColumnCode", y]).Trim();
+                if (!String.IsNullOrEmpty(code))
+                {
+                    Language.LanguageName name = new Language.LanguageName();
+                    name.Name = FormUtils.ToString(this.dataGridViewLanguageName["ColumnName", y]).Trim();
+                    name.ShortName = FormUtils.ToString(this.dataGridViewLanguageName["ColumnShortName", y]).Trim();
+                    lang.Names[code] = name;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 指定されたWebsite設定に画面上で変更された値の格納を行う。
+        /// </summary>
+        /// <param name="site">格納先Website設定。</param>
+        /// <remarks>Websiteについては特に特殊な処理は無いため全て上書きする。</remarks>
+        private void SaveChangedValue(Website site)
+        {
+            // Languageクラス分の設定を行う
+            this.SaveChangedValue(site.Language);
+
+            // サイト情報を格納
+            site.Location = StringUtils.DefaultString(this.textBoxLocation.Text).Trim();
+        }
+
+        /// <summary>
+        /// 指定されたMediaWiki設定に画面上で変更された値の格納を行う。
+        /// </summary>
+        /// <param name="site">格納先MediaWiki設定。</param>
+        /// <remarks>一部パラメータには初期値が存在するため、変更がある場合のみ格納する。</remarks>
+        private void SaveChangedValue(MediaWiki site)
+        {
+            // Websiteクラス分の設定を行う
+            this.SaveChangedValue((Website)site);
+
+            // 初期値を持つパラメータがあるため、全て変更された場合のみ格納する。
+            // ※ もうちょっと綺麗に書きたかったが、リフレクションを使わないと共通化できなさそうだったので力技
+            //    MediaWikiクラス側で行わないのは、場合によっては意図的に初期値と同じ値を設定すること
+            //    もありえるから(初期値が変わる可能性がある場合など)。
+            string str = StringUtils.DefaultString(this.textBoxExportPath.Text).Trim();
+            if (str != site.ExportPath)
+            {
+                site.ExportPath = str;
+            }
+            
+            str = StringUtils.DefaultString(this.textBoxNamespacePath.Text).Trim();
+            if (str != site.NamespacePath)
+            {
+                site.NamespacePath = str;
+            }
+
+            str = StringUtils.DefaultString(this.textBoxRedirect.Text).Trim();
+            if (str != site.Redirect)
+            {
+                site.Redirect = str;
+            }
+
+            str = StringUtils.DefaultString(this.textBoxDocumentationTemplate.Text).Trim();
+            if (str != site.DocumentationTemplate)
+            {
+                site.DocumentationTemplate = str;
+            }
+
+            str = StringUtils.DefaultString(this.textBoxDocumentationTemplateDefaultPage.Text).Trim();
+            if (str != site.DocumentationTemplateDefaultPage)
+            {
+                site.DocumentationTemplateDefaultPage = str;
+            }
+
+            // 以下、数値へのparseは事前にチェックしてあるので、ここではチェックしない
+            if (!String.IsNullOrWhiteSpace(this.textBoxTemplateNamespace.Text))
+            {
+                int num = int.Parse(this.textBoxTemplateNamespace.Text);
+                if (site.TemplateNamespace != num)
+                {
+                    site.TemplateNamespace = num;
+                }
+            }
+
+            if (!String.IsNullOrWhiteSpace(this.textBoxCategoryNamespace.Text))
+            {
+                int num = int.Parse(this.textBoxCategoryNamespace.Text);
+                if (site.CategoryNamespace != num)
+                {
+                    site.CategoryNamespace = num;
+                }
+            }
+
+            if (!String.IsNullOrWhiteSpace(this.textBoxFileNamespace.Text))
+            {
+                int num = int.Parse(this.textBoxFileNamespace.Text);
+                if (site.FileNamespace != num)
+                {
+                    site.FileNamespace = num;
+                }
+            }
+        }
+
+        #endregion
+
+        #endregion
+
+        #region その他タブのイベントのメソッド
+        
+        /// <summary>
+        /// キャッシュ有効期限ボックスバリデート処理。。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void TextBoxCacheExpire_Validating(object sender, CancelEventArgs e)
+        {
+            TextBox box = (TextBox)sender;
+            box.Text = StringUtils.DefaultString(box.Text).Trim();
+            int expire;
+            if (!int.TryParse(box.Text, out expire) || expire < 0)
+            {
+                this.errorProvider.SetError(box, Resources.WarningMessageIgnoreCacheExpire);
+                e.Cancel = true;
+            }
+        }
+
+        /// <summary>
+        /// ウェブサイトURLクリック時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void LinkLabelWebsite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            // リンクを開く
+            System.Diagnostics.Process.Start(((LinkLabel)sender).Text);
+        }
+
+        #endregion
+
+        #region 共通のイベントメソッド
+        
+        /// <summary>
+        /// 汎用のエラープロバイダ初期化処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ResetErrorProvider_Validated(object sender, EventArgs e)
+        {
+            this.errorProvider.SetError((Control)sender, null);
+        }
+
+        /// <summary>
+        /// 汎用の行編集時のエラーテキスト初期化処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ResetErrorText_RowValidated(object sender, DataGridViewCellEventArgs e)
+        {
+            ((DataGridView)sender).Rows[e.RowIndex].ErrorText = String.Empty;
+        }
+
+        /// <summary>
+        /// 汎用のテーブルエラーテキスト初期化処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ResetErrorText_Validated(object sender, EventArgs e)
+        {
+            // 全行のエラーメッセージを解除
+            foreach (DataGridViewRow row in ((DataGridView)sender).Rows)
+            {
+                row.ErrorText = String.Empty;
+            }
+        }
+
+        #endregion
+
+        #region 内部クラス
+
+        /// <summary>
+        /// 記事の置き換え対訳表の日付並び替え用クラスです。
+        /// </summary>
+        /// <remarks>取得日時の降順でソート、空の列は先頭にします。</remarks>
+        public class TranslationDictionaryViewComparer : System.Collections.IComparer
+        {
+            /// <summary>
+            /// 2行を比較し、一方が他方より小さいか、等しいか、大きいかを示す値を返します。
+            /// </summary>
+            /// <param name="y">比較する最初の行です。</param>
+            /// <param name="x">比較する 2 番目の行。</param>
+            /// <returns>1以下:xはyより小さい, 0:等しい, 1以上:xはyより大きい</returns>
+            public int Compare(object y, object x)
+            {
+                string xstr = ObjectUtils.ToString(((DataGridViewRow)x).Cells["ColumnTimestamp"].Value);
+                string ystr = ObjectUtils.ToString(((DataGridViewRow)y).Cells["ColumnTimestamp"].Value);
+                if (String.IsNullOrWhiteSpace(xstr) && String.IsNullOrWhiteSpace(ystr))
+                {
+                    return 0;
+                }
+                else if (String.IsNullOrWhiteSpace(xstr))
+                {
+                    return 1;
+                }
+                else if (String.IsNullOrWhiteSpace(ystr))
+                {
+                    return -1;
+                }
+
+                return xstr.CompareTo(ystr);
+            }
+        }
+
+        #endregion
+    }
+}
index aead408..c7d43d0 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<root>\r
-  <!-- \r
-    Microsoft ResX Schema \r
-    \r
-    Version 2.0\r
-    \r
-    The primary goals of this format is to allow a simple XML format \r
-    that is mostly human readable. The generation and parsing of the \r
-    various data types are done through the TypeConverter classes \r
-    associated with the data types.\r
-    \r
-    Example:\r
-    \r
-    ... ado.net/XML headers & schema ...\r
-    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
-    <resheader name="version">2.0</resheader>\r
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
-        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
-    </data>\r
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
-        <comment>This is a comment</comment>\r
-    </data>\r
-                \r
-    There are any number of "resheader" rows that contain simple \r
-    name/value pairs.\r
-    \r
-    Each data row contains a name, and value. The row also contains a \r
-    type or mimetype. Type corresponds to a .NET class that support \r
-    text/value conversion through the TypeConverter architecture. \r
-    Classes that don't support this are serialized and stored with the \r
-    mimetype set.\r
-    \r
-    The mimetype is used for serialized objects, and tells the \r
-    ResXResourceReader how to depersist the object. This is currently not \r
-    extensible. For a given mimetype the value must be set accordingly:\r
-    \r
-    Note - application/x-microsoft.net.object.binary.base64 is the format \r
-    that the ResXResourceWriter will generate, however the reader can \r
-    read any of the formats listed below.\r
-    \r
-    mimetype: application/x-microsoft.net.object.binary.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
-            : and then encoded with base64 encoding.\r
-    \r
-    mimetype: application/x-microsoft.net.object.soap.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
-            : and then encoded with base64 encoding.\r
-\r
-    mimetype: application/x-microsoft.net.object.bytearray.base64\r
-    value   : The object must be serialized into a byte array \r
-            : using a System.ComponentModel.TypeConverter\r
-            : and then encoded with base64 encoding.\r
-    -->\r
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
-    <xsd:element name="root" msdata:IsDataSet="true">\r
-      <xsd:complexType>\r
-        <xsd:choice maxOccurs="unbounded">\r
-          <xsd:element name="metadata">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" use="required" type="xsd:string" />\r
-              <xsd:attribute name="type" type="xsd:string" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="assembly">\r
-            <xsd:complexType>\r
-              <xsd:attribute name="alias" type="xsd:string" />\r
-              <xsd:attribute name="name" type="xsd:string" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="data">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="resheader">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-        </xsd:choice>\r
-      </xsd:complexType>\r
-    </xsd:element>\r
-  </xsd:schema>\r
-  <resheader name="resmimetype">\r
-    <value>text/microsoft-resx</value>\r
-  </resheader>\r
-  <resheader name="version">\r
-    <value>2.0</value>\r
-  </resheader>\r
-  <resheader name="reader">\r
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <resheader name="writer">\r
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
-  <data name="buttonOk.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Bottom</value>\r
-  </data>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="buttonOk.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>215, 411</value>\r
-  </data>\r
-  <data name="buttonOk.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>75, 23</value>\r
-  </data>\r
-  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
-  <data name="buttonOk.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="buttonOk.Text" xml:space="preserve">\r
-    <value>OK</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonOk.Name" xml:space="preserve">\r
-    <value>buttonOk</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonOk.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonOk.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonOk.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="buttonCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Bottom</value>\r
-  </data>\r
-  <data name="buttonCancel.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>335, 411</value>\r
-  </data>\r
-  <data name="buttonCancel.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>75, 23</value>\r
-  </data>\r
-  <data name="buttonCancel.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="buttonCancel.Text" xml:space="preserve">\r
-    <value>キャンセル</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonCancel.Name" xml:space="preserve">\r
-    <value>buttonCancel</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonCancel.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonCancel.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonCancel.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="tabControl.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="dataGridViewItems.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <metadata name="ColumnFromCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnFromCode.HeaderText" xml:space="preserve">\r
-    <value>翻訳元</value>\r
-  </data>\r
-  <data name="ColumnFromCode.ToolTipText" xml:space="preserve">\r
-    <value>記事の置き換えパターンの翻訳元言語です。</value>\r
-  </data>\r
-  <data name="ColumnFromCode.Width" type="System.Int32, mscorlib">\r
-    <value>66</value>\r
-  </data>\r
-  <metadata name="ColumnFromTitle.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnFromTitle.HeaderText" xml:space="preserve">\r
-    <value>記事名</value>\r
-  </data>\r
-  <data name="ColumnFromTitle.ToolTipText" xml:space="preserve">\r
-    <value>記事の置き換えパターンの翻訳元記事名です。</value>\r
-  </data>\r
-  <data name="ColumnFromTitle.Width" type="System.Int32, mscorlib">\r
-    <value>66</value>\r
-  </data>\r
-  <metadata name="ColumnAlias.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnAlias.HeaderText" xml:space="preserve">\r
-    <value>リダイレクト</value>\r
-  </data>\r
-  <data name="ColumnAlias.ToolTipText" xml:space="preserve">\r
-    <value>翻訳元記事名がリダイレクトの場合の、リダイレクト先の記事名です。</value>\r
-  </data>\r
-  <data name="ColumnAlias.Width" type="System.Int32, mscorlib">\r
-    <value>80</value>\r
-  </data>\r
-  <metadata name="ColumnArrow.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnArrow.HeaderText" xml:space="preserve">\r
-    <value />\r
-  </data>\r
-  <data name="ColumnArrow.Width" type="System.Int32, mscorlib">\r
-    <value>21</value>\r
-  </data>\r
-  <metadata name="ColumnToCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnToCode.HeaderText" xml:space="preserve">\r
-    <value>翻訳先</value>\r
-  </data>\r
-  <data name="ColumnToCode.ToolTipText" xml:space="preserve">\r
-    <value>記事の置き換えパターンの翻訳先言語です。</value>\r
-  </data>\r
-  <data name="ColumnToCode.Width" type="System.Int32, mscorlib">\r
-    <value>66</value>\r
-  </data>\r
-  <metadata name="ColumnToTitle.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnToTitle.HeaderText" xml:space="preserve">\r
-    <value>記事名</value>\r
-  </data>\r
-  <data name="ColumnToTitle.ToolTipText" xml:space="preserve">\r
-    <value>記事の置き換えパターンの翻訳先記事名です。\r
-言語間リンクが無い場合は空欄です。</value>\r
-  </data>\r
-  <data name="ColumnToTitle.Width" type="System.Int32, mscorlib">\r
-    <value>66</value>\r
-  </data>\r
-  <metadata name="ColumnTimestamp.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnTimestamp.HeaderText" xml:space="preserve">\r
-    <value>取得日時</value>\r
-  </data>\r
-  <data name="ColumnTimestamp.ToolTipText" xml:space="preserve">\r
-    <value>置き換えパターンを言語間リンクから取得した場合の取得日時です。\r
-取得日時から一定期間キャッシュとしてこの置き換えを使用します。\r
-空欄の場合、無期限で使用します。</value>\r
-  </data>\r
-  <data name="ColumnTimestamp.Width" type="System.Int32, mscorlib">\r
-    <value>78</value>\r
-  </data>\r
-  <data name="dataGridViewItems.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 6</value>\r
-  </data>\r
-  <data name="dataGridViewItems.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>580, 355</value>\r
-  </data>\r
-  <data name="dataGridViewItems.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewItems.Name" xml:space="preserve">\r
-    <value>dataGridViewItems</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewItems.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewItems.Parent" xml:space="preserve">\r
-    <value>tabPageItems</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewItems.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="tabPageItems.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>4, 22</value>\r
-  </data>\r
-  <data name="tabPageItems.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
-    <value>3, 3, 3, 3</value>\r
-  </data>\r
-  <data name="tabPageItems.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>592, 367</value>\r
-  </data>\r
-  <data name="tabPageItems.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="tabPageItems.Text" xml:space="preserve">\r
-    <value>記事の置き換え</value>\r
-  </data>\r
-  <data name="tabPageItems.ToolTipText" xml:space="preserve">\r
-    <value>記事の置き換えパターンです。\r
-言語間リンクを使用せず、固定で置き換えを行う場合は、こちらに登録してください。\r
-また一度取得した言語間リンクは自動的に登録され、一定期間キャッシュとして使用されます。\r
-再取得したい場合は、該当行を削除してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageItems.Name" xml:space="preserve">\r
-    <value>tabPageItems</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageItems.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageItems.Parent" xml:space="preserve">\r
-    <value>tabControl</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageItems.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Name" xml:space="preserve">\r
-    <value>dataGridViewHeading</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Parent" xml:space="preserve">\r
-    <value>tabPageHeadings</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="tabPageHeadings.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>4, 22</value>\r
-  </data>\r
-  <data name="tabPageHeadings.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
-    <value>3, 3, 3, 3</value>\r
-  </data>\r
-  <data name="tabPageHeadings.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>592, 367</value>\r
-  </data>\r
-  <data name="tabPageHeadings.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="tabPageHeadings.Text" xml:space="preserve">\r
-    <value>見出しの置き換え</value>\r
-  </data>\r
-  <data name="tabPageHeadings.ToolTipText" xml:space="preserve">\r
-    <value>見出しの置き換えパターンです。\r
-見出しを置き換える場合、こちらに各言語での語句を登録してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageHeadings.Name" xml:space="preserve">\r
-    <value>tabPageHeadings</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageHeadings.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageHeadings.Parent" xml:space="preserve">\r
-    <value>tabControl</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageHeadings.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Name" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Name" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Name" xml:space="preserve">\r
-    <value>comboBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Name" xml:space="preserve">\r
-    <value>labelLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="tabPageServer.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>4, 22</value>\r
-  </data>\r
-  <data name="tabPageServer.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
-    <value>3, 3, 3, 3</value>\r
-  </data>\r
-  <data name="tabPageServer.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>592, 367</value>\r
-  </data>\r
-  <data name="tabPageServer.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="tabPageServer.Text" xml:space="preserve">\r
-    <value>サーバー/言語</value>\r
-  </data>\r
-  <data name="tabPageServer.ToolTipText" xml:space="preserve">\r
-    <value>各言語ごとのサーバー/書式等の設定です。</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageServer.Name" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageServer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageServer.Parent" xml:space="preserve">\r
-    <value>tabControl</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageServer.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Name" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Parent" xml:space="preserve">\r
-    <value>tabPageApplication</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Name" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Parent" xml:space="preserve">\r
-    <value>tabPageApplication</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="tabPageApplication.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>4, 22</value>\r
-  </data>\r
-  <data name="tabPageApplication.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
-    <value>3, 3, 3, 3</value>\r
-  </data>\r
-  <data name="tabPageApplication.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>592, 367</value>\r
-  </data>\r
-  <data name="tabPageApplication.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="tabPageApplication.Text" xml:space="preserve">\r
-    <value>その他</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageApplication.Name" xml:space="preserve">\r
-    <value>tabPageApplication</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageApplication.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageApplication.Parent" xml:space="preserve">\r
-    <value>tabControl</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabPageApplication.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="tabControl.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 12</value>\r
-  </data>\r
-  <data name="tabControl.ShowToolTips" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="tabControl.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>600, 393</value>\r
-  </data>\r
-  <data name="tabControl.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>148, 17</value>\r
-  </metadata>\r
-  <data name="tabControl.ToolTip" xml:space="preserve">\r
-    <value>その他の設定・情報です。</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabControl.Name" xml:space="preserve">\r
-    <value>tabControl</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabControl.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabControl.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;tabControl.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="dataGridViewHeading.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="dataGridViewHeading.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 6</value>\r
-  </data>\r
-  <data name="dataGridViewHeading.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>580, 355</value>\r
-  </data>\r
-  <data name="dataGridViewHeading.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Name" xml:space="preserve">\r
-    <value>dataGridViewHeading</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.Parent" xml:space="preserve">\r
-    <value>tabPageHeadings</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewHeading.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Name" xml:space="preserve">\r
-    <value>groupBoxLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Name" xml:space="preserve">\r
-    <value>textBoxBracket</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Name" xml:space="preserve">\r
-    <value>labelBracket</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.Enabled" type="System.Boolean, mscorlib">\r
-    <value>False</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>300, 39</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>286, 322</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="groupBoxLanguage.Text" xml:space="preserve">\r
-    <value>言語の設定</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Name" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguage.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>148, 17</value>\r
-  </metadata>\r
-  <data name="groupBoxLanguageName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Name" xml:space="preserve">\r
-    <value>dataGridViewLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="groupBoxLanguageName.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>8, 43</value>\r
-  </data>\r
-  <data name="groupBoxLanguageName.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>272, 273</value>\r
-  </data>\r
-  <data name="groupBoxLanguageName.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxLanguageName.Text" xml:space="preserve">\r
-    <value>各言語での言語名</value>\r
-  </data>\r
-  <data name="groupBoxLanguageName.ToolTip" xml:space="preserve">\r
-    <value>その言語が、各言語でなんと表記されるかを登録します。\r
-(例 日本語→英語では Japanese と表記)</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Name" xml:space="preserve">\r
-    <value>groupBoxLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxLanguageName.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <metadata name="ColumnCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <metadata name="ColumnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <metadata name="ColumnShortName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="dataGridViewLanguageName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="dataGridViewLanguageName.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 18</value>\r
-  </data>\r
-  <data name="dataGridViewLanguageName.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>260, 249</value>\r
-  </data>\r
-  <data name="dataGridViewLanguageName.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Name" xml:space="preserve">\r
-    <value>dataGridViewLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguageName</value>\r
-  </data>\r
-  <data name="&gt;&gt;dataGridViewLanguageName.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <metadata name="ColumnCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnCode.HeaderText" xml:space="preserve">\r
-    <value>コード</value>\r
-  </data>\r
-  <data name="ColumnCode.ToolTipText" xml:space="preserve">\r
-    <value>表記先の言語です。</value>\r
-  </data>\r
-  <data name="ColumnCode.Width" type="System.Int32, mscorlib">\r
-    <value>53</value>\r
-  </data>\r
-  <metadata name="ColumnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnName.HeaderText" xml:space="preserve">\r
-    <value>名称(記事名)</value>\r
-  </data>\r
-  <data name="ColumnName.ToolTipText" xml:space="preserve">\r
-    <value>表記先の言語での名称です。Wikipedia記事名が望ましいです。</value>\r
-  </data>\r
-  <data name="ColumnName.Width" type="System.Int32, mscorlib">\r
-    <value>78</value>\r
-  </data>\r
-  <metadata name="ColumnShortName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="ColumnShortName.HeaderText" xml:space="preserve">\r
-    <value>略称</value>\r
-  </data>\r
-  <data name="ColumnShortName.ToolTipText" xml:space="preserve">\r
-    <value>表記先の言語での略称です。特に不要な場合空欄です。</value>\r
-  </data>\r
-  <data name="ColumnShortName.Width" type="System.Int32, mscorlib">\r
-    <value>51</value>\r
-  </data>\r
-  <data name="textBoxBracket.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>89, 18</value>\r
-  </data>\r
-  <data name="textBoxBracket.MaxLength" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="textBoxBracket.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>100, 19</value>\r
-  </data>\r
-  <data name="textBoxBracket.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxBracket.ToolTip" xml:space="preserve">\r
-    <value>各言語での括弧書きのスタイルを入力します。\r
-括弧の中身部分を {0} としてください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Name" xml:space="preserve">\r
-    <value>textBoxBracket</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxBracket.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="labelBracket.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelBracket.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 21</value>\r
-  </data>\r
-  <data name="labelBracket.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>77, 12</value>\r
-  </data>\r
-  <data name="labelBracket.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelBracket.Text" xml:space="preserve">\r
-    <value>括弧のスタイル:</value>\r
-  </data>\r
-  <data name="labelBracket.ToolTip" xml:space="preserve">\r
-    <value>各言語での括弧書きのスタイルを入力します。\r
-括弧の中身部分を {0} としてください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Name" xml:space="preserve">\r
-    <value>labelBracket</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.Parent" xml:space="preserve">\r
-    <value>groupBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelBracket.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxServer.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Name" xml:space="preserve">\r
-    <value>textBoxDocumentationTemplateDefaultPage</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Name" xml:space="preserve">\r
-    <value>labelDocumentationTemplateDefaultPage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Name" xml:space="preserve">\r
-    <value>textBoxDocumentationTemplate</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Name" xml:space="preserve">\r
-    <value>labelDocumentationTemplate</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Name" xml:space="preserve">\r
-    <value>textBoxFileNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Name" xml:space="preserve">\r
-    <value>labelFileNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.ZOrder" xml:space="preserve">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Name" xml:space="preserve">\r
-    <value>textBoxCategoryNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.ZOrder" xml:space="preserve">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Name" xml:space="preserve">\r
-    <value>labelCategoryNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.ZOrder" xml:space="preserve">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Name" xml:space="preserve">\r
-    <value>textBoxTemplateNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.ZOrder" xml:space="preserve">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Name" xml:space="preserve">\r
-    <value>labelTemplateNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.ZOrder" xml:space="preserve">\r
-    <value>9</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Name" xml:space="preserve">\r
-    <value>textBoxRedirect</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.ZOrder" xml:space="preserve">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Name" xml:space="preserve">\r
-    <value>labelRedirect</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.ZOrder" xml:space="preserve">\r
-    <value>11</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Name" xml:space="preserve">\r
-    <value>textBoxExportPath</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.ZOrder" xml:space="preserve">\r
-    <value>12</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Name" xml:space="preserve">\r
-    <value>labelExportPath</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.ZOrder" xml:space="preserve">\r
-    <value>13</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Name" xml:space="preserve">\r
-    <value>textBoxNamespacePath</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.ZOrder" xml:space="preserve">\r
-    <value>14</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Name" xml:space="preserve">\r
-    <value>labelNamespacePath</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.ZOrder" xml:space="preserve">\r
-    <value>15</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Name" xml:space="preserve">\r
-    <value>textBoxLocation</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.ZOrder" xml:space="preserve">\r
-    <value>16</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Name" xml:space="preserve">\r
-    <value>labelLocation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.ZOrder" xml:space="preserve">\r
-    <value>17</value>\r
-  </data>\r
-  <data name="groupBoxServer.Enabled" type="System.Boolean, mscorlib">\r
-    <value>False</value>\r
-  </data>\r
-  <data name="groupBoxServer.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 39</value>\r
-  </data>\r
-  <data name="groupBoxServer.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>288, 322</value>\r
-  </data>\r
-  <data name="groupBoxServer.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxServer.Text" xml:space="preserve">\r
-    <value>MediaWikiの設定</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Name" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxServer.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>115, 266</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplateDefaultPage.MaxLength" type="System.Int32, mscorlib">\r
-    <value>255</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplateDefaultPage.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>90, 19</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplateDefaultPage.TabIndex" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplateDefaultPage.ToolTip" xml:space="preserve">\r
-    <value>その言語での [[Template:Documentation]] の [[/doc]] に相当する、デフォルトの解説ページ名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Name" xml:space="preserve">\r
-    <value>textBoxDocumentationTemplateDefaultPage</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 269</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>93, 12</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.TabIndex" type="System.Int32, mscorlib">\r
-    <value>17</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.Text" xml:space="preserve">\r
-    <value>デフォルトページ名:</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplateDefaultPage.ToolTip" xml:space="preserve">\r
-    <value>その言語での [[Template:Documentation]] の [[/doc]] に相当する、デフォルトの解説ページ名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Name" xml:space="preserve">\r
-    <value>labelDocumentationTemplateDefaultPage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>115, 241</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplate.MaxLength" type="System.Int32, mscorlib">\r
-    <value>255</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplate.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>140, 19</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplate.TabIndex" type="System.Int32, mscorlib">\r
-    <value>9</value>\r
-  </data>\r
-  <data name="textBoxDocumentationTemplate.ToolTip" xml:space="preserve">\r
-    <value>その言語での [[Template:Documentation]] に相当するテンプレート名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Name" xml:space="preserve">\r
-    <value>textBoxDocumentationTemplate</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxDocumentationTemplate.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 244</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>97, 12</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.TabIndex" type="System.Int32, mscorlib">\r
-    <value>15</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.Text" xml:space="preserve">\r
-    <value>解説用テンプレート:</value>\r
-  </data>\r
-  <data name="labelDocumentationTemplate.ToolTip" xml:space="preserve">\r
-    <value>その言語での [[Template:Documentation]] に相当するテンプレート名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Name" xml:space="preserve">\r
-    <value>labelDocumentationTemplate</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelDocumentationTemplate.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>143, 184</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>36, 19</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="textBoxFileNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、ファイルに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Name" xml:space="preserve">\r
-    <value>textBoxFileNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxFileNamespace.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="labelFileNamespace.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelFileNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 187</value>\r
-  </data>\r
-  <data name="labelFileNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>110, 12</value>\r
-  </data>\r
-  <data name="labelFileNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>14</value>\r
-  </data>\r
-  <data name="labelFileNamespace.Text" xml:space="preserve">\r
-    <value>ファイル名前空間のID:</value>\r
-  </data>\r
-  <data name="labelFileNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、ファイルに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Name" xml:space="preserve">\r
-    <value>labelFileNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelFileNamespace.ZOrder" xml:space="preserve">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>143, 159</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>36, 19</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="textBoxCategoryNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、カテゴリに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Name" xml:space="preserve">\r
-    <value>textBoxCategoryNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCategoryNamespace.ZOrder" xml:space="preserve">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 162</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>110, 12</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>12</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.Text" xml:space="preserve">\r
-    <value>カテゴリ名前空間のID:</value>\r
-  </data>\r
-  <data name="labelCategoryNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、カテゴリに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Name" xml:space="preserve">\r
-    <value>labelCategoryNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCategoryNamespace.ZOrder" xml:space="preserve">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>143, 134</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>36, 19</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="textBoxTemplateNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、テンプレートに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Name" xml:space="preserve">\r
-    <value>textBoxTemplateNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxTemplateNamespace.ZOrder" xml:space="preserve">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 137</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>130, 12</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.TabIndex" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.Text" xml:space="preserve">\r
-    <value>テンプレート名前空間のID:</value>\r
-  </data>\r
-  <data name="labelTemplateNamespace.ToolTip" xml:space="preserve">\r
-    <value>上記APIで取得した名前空間のうち、テンプレートに該当する番号を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Name" xml:space="preserve">\r
-    <value>labelTemplateNamespace</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTemplateNamespace.ZOrder" xml:space="preserve">\r
-    <value>9</value>\r
-  </data>\r
-  <data name="textBoxRedirect.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>115, 214</value>\r
-  </data>\r
-  <data name="textBoxRedirect.MaxLength" type="System.Int32, mscorlib">\r
-    <value>100</value>\r
-  </data>\r
-  <data name="textBoxRedirect.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>140, 19</value>\r
-  </data>\r
-  <data name="textBoxRedirect.TabIndex" type="System.Int32, mscorlib">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="textBoxRedirect.ToolTip" xml:space="preserve">\r
-    <value>その言語でのリダイレクトの書式(例 #転送 )を入力します。\r
-英語版に設定した値(例 #REDIRECT )については、全言語で有効となります。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Name" xml:space="preserve">\r
-    <value>textBoxRedirect</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxRedirect.ZOrder" xml:space="preserve">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="labelRedirect.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelRedirect.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 217</value>\r
-  </data>\r
-  <data name="labelRedirect.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>103, 12</value>\r
-  </data>\r
-  <data name="labelRedirect.TabIndex" type="System.Int32, mscorlib">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="labelRedirect.Text" xml:space="preserve">\r
-    <value>リダイレクトの文字列:</value>\r
-  </data>\r
-  <data name="labelRedirect.ToolTip" xml:space="preserve">\r
-    <value>その言語でのリダイレクトの書式(例 #転送 )を入力します。\r
-英語版に設定した値(例 #REDIRECT )については、全言語で有効となります。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Name" xml:space="preserve">\r
-    <value>labelRedirect</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRedirect.ZOrder" xml:space="preserve">\r
-    <value>11</value>\r
-  </data>\r
-  <data name="textBoxExportPath.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>81, 66</value>\r
-  </data>\r
-  <data name="textBoxExportPath.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2083</value>\r
-  </data>\r
-  <data name="textBoxExportPath.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>174, 19</value>\r
-  </data>\r
-  <data name="textBoxExportPath.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxExportPath.ToolTip" xml:space="preserve">\r
-    <value>サーバーから記事をXMLでダウンロードするためのパスを入力します。\r
-記事名を代入する部分を {0} としてください。\r
-\r
-どのようなパスかについては、日本語版Wikipediaの\r
-特別ページ → ページの書き出し\r
-などを参照ください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Name" xml:space="preserve">\r
-    <value>textBoxExportPath</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxExportPath.ZOrder" xml:space="preserve">\r
-    <value>12</value>\r
-  </data>\r
-  <data name="labelExportPath.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelExportPath.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 51</value>\r
-  </data>\r
-  <data name="labelExportPath.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>142, 12</value>\r
-  </data>\r
-  <data name="labelExportPath.TabIndex" type="System.Int32, mscorlib">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="labelExportPath.Text" xml:space="preserve">\r
-    <value>XMLエクスポート用のAPIパス:</value>\r
-  </data>\r
-  <data name="labelExportPath.ToolTip" xml:space="preserve">\r
-    <value>サーバーから記事をXMLでダウンロードするためのパスを入力します。\r
-記事名を代入する部分を {0} としてください。\r
-\r
-どのようなパスかについては、日本語版Wikipediaの\r
-特別ページ → ページの書き出し\r
-などを参照ください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Name" xml:space="preserve">\r
-    <value>labelExportPath</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelExportPath.ZOrder" xml:space="preserve">\r
-    <value>13</value>\r
-  </data>\r
-  <data name="textBoxNamespacePath.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>81, 109</value>\r
-  </data>\r
-  <data name="textBoxNamespacePath.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2083</value>\r
-  </data>\r
-  <data name="textBoxNamespacePath.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>174, 19</value>\r
-  </data>\r
-  <data name="textBoxNamespacePath.TabIndex" type="System.Int32, mscorlib">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="textBoxNamespacePath.ToolTip" xml:space="preserve">\r
-    <value>サーバーから名前空間の情報をXMLでダウンロードするためのパスを入力します。\r
-\r
-どのようなパスかについては、下記URL等を参照してください。\r
-http://www.mediawiki.org/wiki/API:Main_page/ja</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Name" xml:space="preserve">\r
-    <value>textBoxNamespacePath</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxNamespacePath.ZOrder" xml:space="preserve">\r
-    <value>14</value>\r
-  </data>\r
-  <data name="labelNamespacePath.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelNamespacePath.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 94</value>\r
-  </data>\r
-  <data name="labelNamespacePath.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>162, 12</value>\r
-  </data>\r
-  <data name="labelNamespacePath.TabIndex" type="System.Int32, mscorlib">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="labelNamespacePath.Text" xml:space="preserve">\r
-    <value>名前空間情報取得用のAPIパス:</value>\r
-  </data>\r
-  <data name="labelNamespacePath.ToolTip" xml:space="preserve">\r
-    <value>サーバーから名前空間の情報をXMLでダウンロードするためのパスを入力します。\r
-\r
-どのようなパスかについては、下記URL等を参照してください。\r
-http://www.mediawiki.org/wiki/API:Main_page/ja</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Name" xml:space="preserve">\r
-    <value>labelNamespacePath</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelNamespacePath.ZOrder" xml:space="preserve">\r
-    <value>15</value>\r
-  </data>\r
-  <data name="textBoxLocation.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>81, 18</value>\r
-  </data>\r
-  <data name="textBoxLocation.MaxLength" type="System.Int32, mscorlib">\r
-    <value>300</value>\r
-  </data>\r
-  <data name="textBoxLocation.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>174, 19</value>\r
-  </data>\r
-  <data name="textBoxLocation.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxLocation.ToolTip" xml:space="preserve">\r
-    <value>サーバーのURLを入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Name" xml:space="preserve">\r
-    <value>textBoxLocation</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLocation.ZOrder" xml:space="preserve">\r
-    <value>16</value>\r
-  </data>\r
-  <data name="labelLocation.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelLocation.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 22</value>\r
-  </data>\r
-  <data name="labelLocation.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>69, 12</value>\r
-  </data>\r
-  <data name="labelLocation.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelLocation.Text" xml:space="preserve">\r
-    <value>サーバーURL:</value>\r
-  </data>\r
-  <data name="labelLocation.ToolTip" xml:space="preserve">\r
-    <value>サーバーのURLを入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Name" xml:space="preserve">\r
-    <value>labelLocation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.Parent" xml:space="preserve">\r
-    <value>groupBoxServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLocation.ZOrder" xml:space="preserve">\r
-    <value>17</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>57, 13</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.MaxLength" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>85, 20</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="comboBoxLanguage.ToolTip" xml:space="preserve">\r
-    <value>設定を変更したい言語を選択します。\r
-新しい言語を追加するときは、直接言語コードを入力してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Name" xml:space="preserve">\r
-    <value>comboBoxLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxLanguage.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelLanguage.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelLanguage.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>20, 16</value>\r
-  </data>\r
-  <data name="labelLanguage.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>31, 12</value>\r
-  </data>\r
-  <data name="labelLanguage.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelLanguage.Text" xml:space="preserve">\r
-    <value>言語:</value>\r
-  </data>\r
-  <data name="labelLanguage.ToolTip" xml:space="preserve">\r
-    <value>設定を変更したい言語を選択します。\r
-新しい言語を追加するときは、直接言語コードを入力してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Name" xml:space="preserve">\r
-    <value>labelLanguage</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.Parent" xml:space="preserve">\r
-    <value>tabPageServer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelLanguage.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="groupBoxInformation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Name" xml:space="preserve">\r
-    <value>labelWebsite</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Name" xml:space="preserve">\r
-    <value>linkLabelWebsite</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Name" xml:space="preserve">\r
-    <value>labelCopyright</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Name" xml:space="preserve">\r
-    <value>labelApplicationName</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="groupBoxInformation.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>9, 189</value>\r
-  </data>\r
-  <data name="groupBoxInformation.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>577, 169</value>\r
-  </data>\r
-  <data name="groupBoxInformation.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxInformation.Text" xml:space="preserve">\r
-    <value>バージョン情報</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Name" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.Parent" xml:space="preserve">\r
-    <value>tabPageApplication</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxInformation.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelWebsite.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelWebsite.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 67</value>\r
-  </data>\r
-  <data name="labelWebsite.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 12</value>\r
-  </data>\r
-  <data name="labelWebsite.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="labelWebsite.Text" xml:space="preserve">\r
-    <value>配布元:</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Name" xml:space="preserve">\r
-    <value>labelWebsite</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelWebsite.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="linkLabelWebsite.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="linkLabelWebsite.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>61, 67</value>\r
-  </data>\r
-  <data name="linkLabelWebsite.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>166, 12</value>\r
-  </data>\r
-  <data name="linkLabelWebsite.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="linkLabelWebsite.Text" xml:space="preserve">\r
-    <value>http://honeplus.blog50.fc2.com/</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Name" xml:space="preserve">\r
-    <value>linkLabelWebsite</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelWebsite.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="labelCopyright.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelCopyright.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 45</value>\r
-  </data>\r
-  <data name="labelCopyright.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>252, 12</value>\r
-  </data>\r
-  <data name="labelCopyright.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="labelCopyright.Text" xml:space="preserve">\r
-    <value>Copyright (C) Honeplus 2011 ※AssemblyInfo.cs</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Name" xml:space="preserve">\r
-    <value>labelCopyright</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCopyright.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelApplicationName.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelApplicationName.Font" type="System.Drawing.Font, System.Drawing">\r
-    <value>MS UI Gothic, 9pt, style=Bold</value>\r
-  </data>\r
-  <data name="labelApplicationName.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 24</value>\r
-  </data>\r
-  <data name="labelApplicationName.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>373, 12</value>\r
-  </data>\r
-  <data name="labelApplicationName.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelApplicationName.Text" xml:space="preserve">\r
-    <value>Wikipdia翻訳支援ツール Ver1.00 ※FormUtil.ApplicationName()</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Name" xml:space="preserve">\r
-    <value>labelApplicationName</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.Parent" xml:space="preserve">\r
-    <value>groupBoxInformation</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelApplicationName.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="groupBoxApplicationConfig.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Name" xml:space="preserve">\r
-    <value>checkBoxIgnoreError</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Name" xml:space="preserve">\r
-    <value>labelRefererNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Name" xml:space="preserve">\r
-    <value>labelUserAgentNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Name" xml:space="preserve">\r
-    <value>labelChaceNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Name" xml:space="preserve">\r
-    <value>textBoxCacheExpire</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Name" xml:space="preserve">\r
-    <value>textBoxReferer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.ZOrder" xml:space="preserve">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Name" xml:space="preserve">\r
-    <value>labelReferer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.ZOrder" xml:space="preserve">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Name" xml:space="preserve">\r
-    <value>labelCacheExpire</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.ZOrder" xml:space="preserve">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Name" xml:space="preserve">\r
-    <value>textBoxUserAgent</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.ZOrder" xml:space="preserve">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Name" xml:space="preserve">\r
-    <value>labelUserAgent</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.ZOrder" xml:space="preserve">\r
-    <value>9</value>\r
-  </data>\r
-  <data name="groupBoxApplicationConfig.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 6</value>\r
-  </data>\r
-  <data name="groupBoxApplicationConfig.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>580, 177</value>\r
-  </data>\r
-  <data name="groupBoxApplicationConfig.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="groupBoxApplicationConfig.Text" xml:space="preserve">\r
-    <value>アプリケーションの設定</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Name" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.Parent" xml:space="preserve">\r
-    <value>tabPageApplication</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxApplicationConfig.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>10, 99</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>333, 16</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.TabIndex" type="System.Int32, mscorlib">\r
-    <value>11</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.Text" xml:space="preserve">\r
-    <value>エラーを可能な限り無視する(※現在はほとんど機能していません)</value>\r
-  </data>\r
-  <data name="checkBoxIgnoreError.ToolTip" xml:space="preserve">\r
-    <value>エラーが発生した際に、無視して可能な限り処理を続行したい場合、チェックします。\r
-※ 現在はほとんど機能していません。</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Name" xml:space="preserve">\r
-    <value>checkBoxIgnoreError</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;checkBoxIgnoreError.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelRefererNote.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelRefererNote.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>NoControl</value>\r
-  </data>\r
-  <data name="labelRefererNote.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>289, 71</value>\r
-  </data>\r
-  <data name="labelRefererNote.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>189, 12</value>\r
-  </data>\r
-  <data name="labelRefererNote.TabIndex" type="System.Int32, mscorlib">\r
-    <value>9</value>\r
-  </data>\r
-  <data name="labelRefererNote.Text" xml:space="preserve">\r
-    <value>(空欄:なし ※現在のバージョンでは空)</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Name" xml:space="preserve">\r
-    <value>labelRefererNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelRefererNote.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>NoControl</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>289, 46</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>99, 12</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.TabIndex" type="System.Int32, mscorlib">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="labelUserAgentNote.Text" xml:space="preserve">\r
-    <value>(空欄:デフォルト値)</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Name" xml:space="preserve">\r
-    <value>labelUserAgentNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgentNote.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelChaceNote.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelChaceNote.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>183, 18</value>\r
-  </data>\r
-  <data name="labelChaceNote.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>49, 12</value>\r
-  </data>\r
-  <data name="labelChaceNote.TabIndex" type="System.Int32, mscorlib">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="labelChaceNote.Text" xml:space="preserve">\r
-    <value>(0:無効)</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Name" xml:space="preserve">\r
-    <value>labelChaceNote</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelChaceNote.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>134, 15</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.MaxLength" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 19</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxCacheExpire.ToolTip" xml:space="preserve">\r
-    <value>記事の置き換えで取得済みの内容をキャッシュとして使用する有効期限です。\r
-日数、またはキャッシュしない場合0を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Name" xml:space="preserve">\r
-    <value>textBoxCacheExpire</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxCacheExpire.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="textBoxReferer.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>75, 68</value>\r
-  </data>\r
-  <data name="textBoxReferer.MaxLength" type="System.Int32, mscorlib">\r
-    <value>2083</value>\r
-  </data>\r
-  <data name="textBoxReferer.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>209, 19</value>\r
-  </data>\r
-  <data name="textBoxReferer.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="textBoxReferer.ToolTip" xml:space="preserve">\r
-    <value>Referer を固定で指定する場合、URLを入力します。\r
-空欄の場合、Refererは設定しません。\r
-\r
-※ 現状、Referer は動的には設定されません。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Name" xml:space="preserve">\r
-    <value>textBoxReferer</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxReferer.ZOrder" xml:space="preserve">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="labelReferer.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelReferer.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>8, 71</value>\r
-  </data>\r
-  <data name="labelReferer.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>45, 12</value>\r
-  </data>\r
-  <data name="labelReferer.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelReferer.Text" xml:space="preserve">\r
-    <value>Referer:</value>\r
-  </data>\r
-  <data name="labelReferer.ToolTip" xml:space="preserve">\r
-    <value>Referer を固定で指定する場合、URLを入力します。\r
-空欄の場合、Refererは設定しません。\r
-\r
-※ 現状、Referer は動的には設定されません。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Name" xml:space="preserve">\r
-    <value>labelReferer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelReferer.ZOrder" xml:space="preserve">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="labelCacheExpire.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelCacheExpire.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>6, 18</value>\r
-  </data>\r
-  <data name="labelCacheExpire.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>122, 12</value>\r
-  </data>\r
-  <data name="labelCacheExpire.TabIndex" type="System.Int32, mscorlib">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="labelCacheExpire.Text" xml:space="preserve">\r
-    <value>キャッシュ有効期限(日):</value>\r
-  </data>\r
-  <data name="labelCacheExpire.ToolTip" xml:space="preserve">\r
-    <value>記事の置き換えで取得済みの内容をキャッシュとして使用する有効期限です。\r
-日数、またはキャッシュしない場合0を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Name" xml:space="preserve">\r
-    <value>labelCacheExpire</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelCacheExpire.ZOrder" xml:space="preserve">\r
-    <value>7</value>\r
-  </data>\r
-  <data name="textBoxUserAgent.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>75, 43</value>\r
-  </data>\r
-  <data name="textBoxUserAgent.MaxLength" type="System.Int32, mscorlib">\r
-    <value>100</value>\r
-  </data>\r
-  <data name="textBoxUserAgent.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>209, 19</value>\r
-  </data>\r
-  <data name="textBoxUserAgent.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxUserAgent.ToolTip" xml:space="preserve">\r
-    <value>User Agent として使用する文字列を入力します。\r
-空欄の場合、このツール独自のUAを使用します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Name" xml:space="preserve">\r
-    <value>textBoxUserAgent</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxUserAgent.ZOrder" xml:space="preserve">\r
-    <value>8</value>\r
-  </data>\r
-  <data name="labelUserAgent.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelUserAgent.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>8, 46</value>\r
-  </data>\r
-  <data name="labelUserAgent.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>61, 12</value>\r
-  </data>\r
-  <data name="labelUserAgent.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelUserAgent.Text" xml:space="preserve">\r
-    <value>UserAgent:</value>\r
-  </data>\r
-  <data name="labelUserAgent.ToolTip" xml:space="preserve">\r
-    <value>User Agent として使用する文字列を入力します。\r
-空欄の場合、このツール独自のUAを使用します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Name" xml:space="preserve">\r
-    <value>labelUserAgent</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.Parent" xml:space="preserve">\r
-    <value>groupBoxApplicationConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelUserAgent.ZOrder" xml:space="preserve">\r
-    <value>9</value>\r
-  </data>\r
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>17, 17</value>\r
-  </metadata>\r
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">\r
-    <value>6, 12</value>\r
-  </data>\r
-  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">\r
-    <value>624, 443</value>\r
-  </data>\r
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        AAABAAIAICAQAAAABADoAgAAJgAAABAQEAAAAAQAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC\r
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\r
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
-        AAC7sAAAAAAAAAAAAAAAAAAAu7sAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAABEAAAAAuwAAu7sLsAAA\r
-        AAAREAAAALsAC7u7u7AAAAAAAREAAAC7AAuwAAuwAREREREREAAAuwALsAALsAERERERERAAALsAALsA\r
-        C7AAAAAAAREAAAC7AAALu7uwAAAAABEQAAAAuwAAsAALsAAAAAARAAAAu7sAALu7u7AAAAAAAAAAALu7\r
-        AAC7u7sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAAAAA\r
-        AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7uwALsAALsAAAAAAAAAC7\r
-        u7uwC7AAC7AAAAAAAAALuwAAsAuwAAuwAAAAAAAAC7AAAAALsAALsAAAAAAAAAu7u7uwC7AAC7AAAAAA\r
-        AAALsAALsAuwAAuwAAAAAAAAC7sAC7ALsAALsAAAAAAAAAC7u7sAC7u7u7AAAAAAAAAAC7uwAAuwu7sA\r
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////\r
-        /////x////8P////z///P88J/x/OAf+PznmAB855gAfPOf+Pz4H/H895/z8PAf//DwP/////////////\r
-        z////8/////////////g55//wGef/49nn/+f55//gGef/55nn/+OZ5//wOAf/+HkP///////////////\r
-        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA\r
-        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3\r
-        d3dERERERERER0////////hHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//\r
-        //////hHT///////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA\r
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==\r
-</value>\r
-  </data>\r
-  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">\r
-    <value>640, 480</value>\r
-  </data>\r
-  <data name="$this.Text" xml:space="preserve">\r
-    <value>設定</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnCode.Name" xml:space="preserve">\r
-    <value>ColumnCode</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnCode.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnName.Name" xml:space="preserve">\r
-    <value>ColumnName</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnShortName.Name" xml:space="preserve">\r
-    <value>ColumnShortName</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnShortName.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;errorProvider.Name" xml:space="preserve">\r
-    <value>errorProvider</value>\r
-  </data>\r
-  <data name="&gt;&gt;errorProvider.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ErrorProvider, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;toolTip.Name" xml:space="preserve">\r
-    <value>toolTip</value>\r
-  </data>\r
-  <data name="&gt;&gt;toolTip.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnFromCode.Name" xml:space="preserve">\r
-    <value>ColumnFromCode</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnFromCode.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnFromTitle.Name" xml:space="preserve">\r
-    <value>ColumnFromTitle</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnFromTitle.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnAlias.Name" xml:space="preserve">\r
-    <value>ColumnAlias</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnAlias.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnArrow.Name" xml:space="preserve">\r
-    <value>ColumnArrow</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnArrow.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnToCode.Name" xml:space="preserve">\r
-    <value>ColumnToCode</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnToCode.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnToTitle.Name" xml:space="preserve">\r
-    <value>ColumnToTitle</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnToTitle.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnTimestamp.Name" xml:space="preserve">\r
-    <value>ColumnTimestamp</value>\r
-  </data>\r
-  <data name="&gt;&gt;ColumnTimestamp.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
-    <value>ConfigForm</value>\r
-  </data>\r
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="buttonOk.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom</value>
+  </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, 411</value>
+  </data>
+  <data name="buttonOk.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="buttonOk.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="buttonOk.Text" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="&gt;&gt;buttonOk.Name" xml:space="preserve">
+    <value>buttonOk</value>
+  </data>
+  <data name="&gt;&gt;buttonOk.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonOk.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;buttonOk.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="buttonCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="buttonCancel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>335, 411</value>
+  </data>
+  <data name="buttonCancel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="buttonCancel.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="buttonCancel.Text" xml:space="preserve">
+    <value>キャンセル</value>
+  </data>
+  <data name="&gt;&gt;buttonCancel.Name" xml:space="preserve">
+    <value>buttonCancel</value>
+  </data>
+  <data name="&gt;&gt;buttonCancel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonCancel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;buttonCancel.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="tabControl.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="dataGridViewItems.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <metadata name="ColumnFromCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnFromCode.HeaderText" xml:space="preserve">
+    <value>翻訳元</value>
+  </data>
+  <data name="ColumnFromCode.ToolTipText" xml:space="preserve">
+    <value>記事の置き換えパターンの翻訳元言語です。</value>
+  </data>
+  <data name="ColumnFromCode.Width" type="System.Int32, mscorlib">
+    <value>66</value>
+  </data>
+  <metadata name="ColumnFromTitle.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnFromTitle.HeaderText" xml:space="preserve">
+    <value>記事名</value>
+  </data>
+  <data name="ColumnFromTitle.ToolTipText" xml:space="preserve">
+    <value>記事の置き換えパターンの翻訳元記事名です。</value>
+  </data>
+  <data name="ColumnFromTitle.Width" type="System.Int32, mscorlib">
+    <value>66</value>
+  </data>
+  <metadata name="ColumnAlias.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnAlias.HeaderText" xml:space="preserve">
+    <value>リダイレクト</value>
+  </data>
+  <data name="ColumnAlias.ToolTipText" xml:space="preserve">
+    <value>翻訳元記事名がリダイレクトの場合の、リダイレクト先の記事名です。</value>
+  </data>
+  <data name="ColumnAlias.Width" type="System.Int32, mscorlib">
+    <value>80</value>
+  </data>
+  <metadata name="ColumnArrow.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnArrow.HeaderText" xml:space="preserve">
+    <value />
+  </data>
+  <data name="ColumnArrow.Width" type="System.Int32, mscorlib">
+    <value>21</value>
+  </data>
+  <metadata name="ColumnToCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnToCode.HeaderText" xml:space="preserve">
+    <value>翻訳先</value>
+  </data>
+  <data name="ColumnToCode.ToolTipText" xml:space="preserve">
+    <value>記事の置き換えパターンの翻訳先言語です。</value>
+  </data>
+  <data name="ColumnToCode.Width" type="System.Int32, mscorlib">
+    <value>66</value>
+  </data>
+  <metadata name="ColumnToTitle.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnToTitle.HeaderText" xml:space="preserve">
+    <value>記事名</value>
+  </data>
+  <data name="ColumnToTitle.ToolTipText" xml:space="preserve">
+    <value>記事の置き換えパターンの翻訳先記事名です。
+言語間リンクが無い場合は空欄です。</value>
+  </data>
+  <data name="ColumnToTitle.Width" type="System.Int32, mscorlib">
+    <value>66</value>
+  </data>
+  <metadata name="ColumnTimestamp.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnTimestamp.HeaderText" xml:space="preserve">
+    <value>取得日時</value>
+  </data>
+  <data name="ColumnTimestamp.ToolTipText" xml:space="preserve">
+    <value>置き換えパターンを言語間リンクから取得した場合の取得日時です。
+取得日時から一定期間キャッシュとしてこの置き換えを使用します。
+空欄の場合、無期限で使用します。</value>
+  </data>
+  <data name="ColumnTimestamp.Width" type="System.Int32, mscorlib">
+    <value>78</value>
+  </data>
+  <data name="dataGridViewItems.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 6</value>
+  </data>
+  <data name="dataGridViewItems.Size" type="System.Drawing.Size, System.Drawing">
+    <value>580, 355</value>
+  </data>
+  <data name="dataGridViewItems.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewItems.Name" xml:space="preserve">
+    <value>dataGridViewItems</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewItems.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewItems.Parent" xml:space="preserve">
+    <value>tabPageItems</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewItems.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="tabPageItems.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="tabPageItems.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="tabPageItems.Size" type="System.Drawing.Size, System.Drawing">
+    <value>592, 367</value>
+  </data>
+  <data name="tabPageItems.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="tabPageItems.Text" xml:space="preserve">
+    <value>記事の置き換え</value>
+  </data>
+  <data name="tabPageItems.ToolTipText" xml:space="preserve">
+    <value>記事の置き換えパターンです。
+言語間リンクを使用せず、固定で置き換えを行う場合は、こちらに登録してください。
+また一度取得した言語間リンクは自動的に登録され、一定期間キャッシュとして使用されます。
+再取得したい場合は、該当行を削除してください。</value>
+  </data>
+  <data name="&gt;&gt;tabPageItems.Name" xml:space="preserve">
+    <value>tabPageItems</value>
+  </data>
+  <data name="&gt;&gt;tabPageItems.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabPageItems.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabPageItems.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Name" xml:space="preserve">
+    <value>dataGridViewHeading</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Parent" xml:space="preserve">
+    <value>tabPageHeadings</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="tabPageHeadings.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="tabPageHeadings.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="tabPageHeadings.Size" type="System.Drawing.Size, System.Drawing">
+    <value>592, 367</value>
+  </data>
+  <data name="tabPageHeadings.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="tabPageHeadings.Text" xml:space="preserve">
+    <value>見出しの置き換え</value>
+  </data>
+  <data name="tabPageHeadings.ToolTipText" xml:space="preserve">
+    <value>見出しの置き換えパターンです。
+見出しを置き換える場合、こちらに各言語での語句を登録してください。</value>
+  </data>
+  <data name="&gt;&gt;tabPageHeadings.Name" xml:space="preserve">
+    <value>tabPageHeadings</value>
+  </data>
+  <data name="&gt;&gt;tabPageHeadings.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabPageHeadings.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabPageHeadings.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Name" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Name" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Name" xml:space="preserve">
+    <value>comboBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Name" xml:space="preserve">
+    <value>labelLanguage</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="tabPageServer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="tabPageServer.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="tabPageServer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>592, 367</value>
+  </data>
+  <data name="tabPageServer.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="tabPageServer.Text" xml:space="preserve">
+    <value>サーバー/言語</value>
+  </data>
+  <data name="tabPageServer.ToolTipText" xml:space="preserve">
+    <value>各言語ごとのサーバー/書式等の設定です。</value>
+  </data>
+  <data name="&gt;&gt;tabPageServer.Name" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;tabPageServer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabPageServer.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabPageServer.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Name" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Parent" xml:space="preserve">
+    <value>tabPageApplication</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Name" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Parent" xml:space="preserve">
+    <value>tabPageApplication</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="tabPageApplication.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="tabPageApplication.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="tabPageApplication.Size" type="System.Drawing.Size, System.Drawing">
+    <value>592, 367</value>
+  </data>
+  <data name="tabPageApplication.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="tabPageApplication.Text" xml:space="preserve">
+    <value>その他</value>
+  </data>
+  <data name="&gt;&gt;tabPageApplication.Name" xml:space="preserve">
+    <value>tabPageApplication</value>
+  </data>
+  <data name="&gt;&gt;tabPageApplication.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabPageApplication.Parent" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabPageApplication.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="tabControl.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 12</value>
+  </data>
+  <data name="tabControl.ShowToolTips" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="tabControl.Size" type="System.Drawing.Size, System.Drawing">
+    <value>600, 393</value>
+  </data>
+  <data name="tabControl.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>148, 17</value>
+  </metadata>
+  <data name="tabControl.ToolTip" xml:space="preserve">
+    <value>その他の設定・情報です。</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Name" xml:space="preserve">
+    <value>tabControl</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabControl.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;tabControl.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="dataGridViewHeading.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="dataGridViewHeading.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 6</value>
+  </data>
+  <data name="dataGridViewHeading.Size" type="System.Drawing.Size, System.Drawing">
+    <value>580, 355</value>
+  </data>
+  <data name="dataGridViewHeading.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Name" xml:space="preserve">
+    <value>dataGridViewHeading</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.Parent" xml:space="preserve">
+    <value>tabPageHeadings</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewHeading.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBoxLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Name" xml:space="preserve">
+    <value>groupBoxLanguageName</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Name" xml:space="preserve">
+    <value>textBoxBracket</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Name" xml:space="preserve">
+    <value>labelBracket</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="groupBoxLanguage.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="groupBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>300, 39</value>
+  </data>
+  <data name="groupBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>286, 322</value>
+  </data>
+  <data name="groupBoxLanguage.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="groupBoxLanguage.Text" xml:space="preserve">
+    <value>言語の設定</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Name" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguage.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>148, 17</value>
+  </metadata>
+  <data name="groupBoxLanguageName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Name" xml:space="preserve">
+    <value>dataGridViewLanguageName</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Parent" xml:space="preserve">
+    <value>groupBoxLanguageName</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="groupBoxLanguageName.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 43</value>
+  </data>
+  <data name="groupBoxLanguageName.Size" type="System.Drawing.Size, System.Drawing">
+    <value>272, 273</value>
+  </data>
+  <data name="groupBoxLanguageName.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="groupBoxLanguageName.Text" xml:space="preserve">
+    <value>各言語での言語名</value>
+  </data>
+  <data name="groupBoxLanguageName.ToolTip" xml:space="preserve">
+    <value>その言語が、各言語でなんと表記されるかを登録します。
+(例 日本語→英語では Japanese と表記)</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Name" xml:space="preserve">
+    <value>groupBoxLanguageName</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;groupBoxLanguageName.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="ColumnCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnShortName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="dataGridViewLanguageName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="dataGridViewLanguageName.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 18</value>
+  </data>
+  <data name="dataGridViewLanguageName.Size" type="System.Drawing.Size, System.Drawing">
+    <value>260, 249</value>
+  </data>
+  <data name="dataGridViewLanguageName.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Name" xml:space="preserve">
+    <value>dataGridViewLanguageName</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.Parent" xml:space="preserve">
+    <value>groupBoxLanguageName</value>
+  </data>
+  <data name="&gt;&gt;dataGridViewLanguageName.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="ColumnCode.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnCode.HeaderText" xml:space="preserve">
+    <value>コード</value>
+  </data>
+  <data name="ColumnCode.ToolTipText" xml:space="preserve">
+    <value>表記先の言語です。</value>
+  </data>
+  <data name="ColumnCode.Width" type="System.Int32, mscorlib">
+    <value>53</value>
+  </data>
+  <metadata name="ColumnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnName.HeaderText" xml:space="preserve">
+    <value>名称(記事名)</value>
+  </data>
+  <data name="ColumnName.ToolTipText" xml:space="preserve">
+    <value>表記先の言語での名称です。Wikipedia記事名が望ましいです。</value>
+  </data>
+  <data name="ColumnName.Width" type="System.Int32, mscorlib">
+    <value>78</value>
+  </data>
+  <metadata name="ColumnShortName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="ColumnShortName.HeaderText" xml:space="preserve">
+    <value>略称</value>
+  </data>
+  <data name="ColumnShortName.ToolTipText" xml:space="preserve">
+    <value>表記先の言語での略称です。特に不要な場合空欄です。</value>
+  </data>
+  <data name="ColumnShortName.Width" type="System.Int32, mscorlib">
+    <value>51</value>
+  </data>
+  <data name="textBoxBracket.Location" type="System.Drawing.Point, System.Drawing">
+    <value>89, 18</value>
+  </data>
+  <data name="textBoxBracket.MaxLength" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="textBoxBracket.Size" type="System.Drawing.Size, System.Drawing">
+    <value>100, 19</value>
+  </data>
+  <data name="textBoxBracket.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="textBoxBracket.ToolTip" xml:space="preserve">
+    <value>各言語での括弧書きのスタイルを入力します。
+括弧の中身部分を {0} としてください。</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Name" xml:space="preserve">
+    <value>textBoxBracket</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;textBoxBracket.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="labelBracket.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelBracket.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 21</value>
+  </data>
+  <data name="labelBracket.Size" type="System.Drawing.Size, System.Drawing">
+    <value>77, 12</value>
+  </data>
+  <data name="labelBracket.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelBracket.Text" xml:space="preserve">
+    <value>括弧のスタイル:</value>
+  </data>
+  <data name="labelBracket.ToolTip" xml:space="preserve">
+    <value>各言語での括弧書きのスタイルを入力します。
+括弧の中身部分を {0} としてください。</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Name" xml:space="preserve">
+    <value>labelBracket</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.Parent" xml:space="preserve">
+    <value>groupBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;labelBracket.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="groupBoxServer.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Name" xml:space="preserve">
+    <value>textBoxDocumentationTemplateDefaultPage</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Name" xml:space="preserve">
+    <value>labelDocumentationTemplateDefaultPage</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Name" xml:space="preserve">
+    <value>textBoxDocumentationTemplate</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Name" xml:space="preserve">
+    <value>labelDocumentationTemplate</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Name" xml:space="preserve">
+    <value>textBoxFileNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Name" xml:space="preserve">
+    <value>labelFileNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Name" xml:space="preserve">
+    <value>textBoxCategoryNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Name" xml:space="preserve">
+    <value>labelCategoryNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Name" xml:space="preserve">
+    <value>textBoxTemplateNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Name" xml:space="preserve">
+    <value>labelTemplateNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Name" xml:space="preserve">
+    <value>textBoxRedirect</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.ZOrder" xml:space="preserve">
+    <value>10</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Name" xml:space="preserve">
+    <value>labelRedirect</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.ZOrder" xml:space="preserve">
+    <value>11</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Name" xml:space="preserve">
+    <value>textBoxExportPath</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.ZOrder" xml:space="preserve">
+    <value>12</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Name" xml:space="preserve">
+    <value>labelExportPath</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.ZOrder" xml:space="preserve">
+    <value>13</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Name" xml:space="preserve">
+    <value>textBoxNamespacePath</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.ZOrder" xml:space="preserve">
+    <value>14</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Name" xml:space="preserve">
+    <value>labelNamespacePath</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.ZOrder" xml:space="preserve">
+    <value>15</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Name" xml:space="preserve">
+    <value>textBoxLocation</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.ZOrder" xml:space="preserve">
+    <value>16</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Name" xml:space="preserve">
+    <value>labelLocation</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.ZOrder" xml:space="preserve">
+    <value>17</value>
+  </data>
+  <data name="groupBoxServer.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="groupBoxServer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 39</value>
+  </data>
+  <data name="groupBoxServer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>288, 322</value>
+  </data>
+  <data name="groupBoxServer.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="groupBoxServer.Text" xml:space="preserve">
+    <value>MediaWikiの設定</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Name" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxServer.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="textBoxDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>115, 266</value>
+  </data>
+  <data name="textBoxDocumentationTemplateDefaultPage.MaxLength" type="System.Int32, mscorlib">
+    <value>255</value>
+  </data>
+  <data name="textBoxDocumentationTemplateDefaultPage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>90, 19</value>
+  </data>
+  <data name="textBoxDocumentationTemplateDefaultPage.TabIndex" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="textBoxDocumentationTemplateDefaultPage.ToolTip" xml:space="preserve">
+    <value>その言語での [[Template:Documentation]] の [[/doc]] に相当する、デフォルトの解説ページ名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Name" xml:space="preserve">
+    <value>textBoxDocumentationTemplateDefaultPage</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 269</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>93, 12</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.TabIndex" type="System.Int32, mscorlib">
+    <value>17</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.Text" xml:space="preserve">
+    <value>デフォルトページ名:</value>
+  </data>
+  <data name="labelDocumentationTemplateDefaultPage.ToolTip" xml:space="preserve">
+    <value>その言語での [[Template:Documentation]] の [[/doc]] に相当する、デフォルトの解説ページ名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Name" xml:space="preserve">
+    <value>labelDocumentationTemplateDefaultPage</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="textBoxDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">
+    <value>115, 241</value>
+  </data>
+  <data name="textBoxDocumentationTemplate.MaxLength" type="System.Int32, mscorlib">
+    <value>255</value>
+  </data>
+  <data name="textBoxDocumentationTemplate.Size" type="System.Drawing.Size, System.Drawing">
+    <value>140, 19</value>
+  </data>
+  <data name="textBoxDocumentationTemplate.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="textBoxDocumentationTemplate.ToolTip" xml:space="preserve">
+    <value>その言語での [[Template:Documentation]] に相当するテンプレート名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Name" xml:space="preserve">
+    <value>textBoxDocumentationTemplate</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxDocumentationTemplate.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="labelDocumentationTemplate.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 244</value>
+  </data>
+  <data name="labelDocumentationTemplate.Size" type="System.Drawing.Size, System.Drawing">
+    <value>97, 12</value>
+  </data>
+  <data name="labelDocumentationTemplate.TabIndex" type="System.Int32, mscorlib">
+    <value>15</value>
+  </data>
+  <data name="labelDocumentationTemplate.Text" xml:space="preserve">
+    <value>解説用テンプレート:</value>
+  </data>
+  <data name="labelDocumentationTemplate.ToolTip" xml:space="preserve">
+    <value>その言語での [[Template:Documentation]] に相当するテンプレート名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Name" xml:space="preserve">
+    <value>labelDocumentationTemplate</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelDocumentationTemplate.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="textBoxFileNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="textBoxFileNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>143, 184</value>
+  </data>
+  <data name="textBoxFileNamespace.MaxLength" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="textBoxFileNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>36, 19</value>
+  </data>
+  <data name="textBoxFileNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="textBoxFileNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、ファイルに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Name" xml:space="preserve">
+    <value>textBoxFileNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxFileNamespace.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="labelFileNamespace.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelFileNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 187</value>
+  </data>
+  <data name="labelFileNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>110, 12</value>
+  </data>
+  <data name="labelFileNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>14</value>
+  </data>
+  <data name="labelFileNamespace.Text" xml:space="preserve">
+    <value>ファイル名前空間のID:</value>
+  </data>
+  <data name="labelFileNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、ファイルに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Name" xml:space="preserve">
+    <value>labelFileNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelFileNamespace.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="textBoxCategoryNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="textBoxCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>143, 159</value>
+  </data>
+  <data name="textBoxCategoryNamespace.MaxLength" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="textBoxCategoryNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>36, 19</value>
+  </data>
+  <data name="textBoxCategoryNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="textBoxCategoryNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、カテゴリに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Name" xml:space="preserve">
+    <value>textBoxCategoryNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxCategoryNamespace.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="labelCategoryNamespace.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 162</value>
+  </data>
+  <data name="labelCategoryNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>110, 12</value>
+  </data>
+  <data name="labelCategoryNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>12</value>
+  </data>
+  <data name="labelCategoryNamespace.Text" xml:space="preserve">
+    <value>カテゴリ名前空間のID:</value>
+  </data>
+  <data name="labelCategoryNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、カテゴリに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Name" xml:space="preserve">
+    <value>labelCategoryNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelCategoryNamespace.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="textBoxTemplateNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="textBoxTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>143, 134</value>
+  </data>
+  <data name="textBoxTemplateNamespace.MaxLength" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="textBoxTemplateNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>36, 19</value>
+  </data>
+  <data name="textBoxTemplateNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="textBoxTemplateNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、テンプレートに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Name" xml:space="preserve">
+    <value>textBoxTemplateNamespace</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxTemplateNamespace.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="labelTemplateNamespace.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 137</value>
+  </data>
+  <data name="labelTemplateNamespace.Size" type="System.Drawing.Size, System.Drawing">
+    <value>130, 12</value>
+  </data>
+  <data name="labelTemplateNamespace.TabIndex" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="labelTemplateNamespace.Text" xml:space="preserve">
+    <value>テンプレート名前空間のID:</value>
+  </data>
+  <data name="labelTemplateNamespace.ToolTip" xml:space="preserve">
+    <value>上記APIで取得した名前空間のうち、テンプレートに該当する番号を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Name" xml:space="preserve">
+    <value>labelTemplateNamespace</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelTemplateNamespace.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="textBoxRedirect.Location" type="System.Drawing.Point, System.Drawing">
+    <value>115, 214</value>
+  </data>
+  <data name="textBoxRedirect.MaxLength" type="System.Int32, mscorlib">
+    <value>100</value>
+  </data>
+  <data name="textBoxRedirect.Size" type="System.Drawing.Size, System.Drawing">
+    <value>140, 19</value>
+  </data>
+  <data name="textBoxRedirect.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="textBoxRedirect.ToolTip" xml:space="preserve">
+    <value>その言語でのリダイレクトの書式(例 #転送 )を入力します。
+英語版に設定した値(例 #REDIRECT )については、全言語で有効となります。</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Name" xml:space="preserve">
+    <value>textBoxRedirect</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxRedirect.ZOrder" xml:space="preserve">
+    <value>10</value>
+  </data>
+  <data name="labelRedirect.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelRedirect.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 217</value>
+  </data>
+  <data name="labelRedirect.Size" type="System.Drawing.Size, System.Drawing">
+    <value>103, 12</value>
+  </data>
+  <data name="labelRedirect.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="labelRedirect.Text" xml:space="preserve">
+    <value>リダイレクトの文字列:</value>
+  </data>
+  <data name="labelRedirect.ToolTip" xml:space="preserve">
+    <value>その言語でのリダイレクトの書式(例 #転送 )を入力します。
+英語版に設定した値(例 #REDIRECT )については、全言語で有効となります。</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Name" xml:space="preserve">
+    <value>labelRedirect</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelRedirect.ZOrder" xml:space="preserve">
+    <value>11</value>
+  </data>
+  <data name="textBoxExportPath.Location" type="System.Drawing.Point, System.Drawing">
+    <value>81, 66</value>
+  </data>
+  <data name="textBoxExportPath.MaxLength" type="System.Int32, mscorlib">
+    <value>2083</value>
+  </data>
+  <data name="textBoxExportPath.Size" type="System.Drawing.Size, System.Drawing">
+    <value>174, 19</value>
+  </data>
+  <data name="textBoxExportPath.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="textBoxExportPath.ToolTip" xml:space="preserve">
+    <value>サーバーから記事をXMLでダウンロードするためのパスを入力します。
+記事名を代入する部分を {0} としてください。
+
+どのようなパスかについては、日本語版Wikipediaの
+特別ページ → ページの書き出し
+などを参照ください。</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Name" xml:space="preserve">
+    <value>textBoxExportPath</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxExportPath.ZOrder" xml:space="preserve">
+    <value>12</value>
+  </data>
+  <data name="labelExportPath.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelExportPath.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 51</value>
+  </data>
+  <data name="labelExportPath.Size" type="System.Drawing.Size, System.Drawing">
+    <value>142, 12</value>
+  </data>
+  <data name="labelExportPath.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="labelExportPath.Text" xml:space="preserve">
+    <value>XMLエクスポート用のAPIパス:</value>
+  </data>
+  <data name="labelExportPath.ToolTip" xml:space="preserve">
+    <value>サーバーから記事をXMLでダウンロードするためのパスを入力します。
+記事名を代入する部分を {0} としてください。
+
+どのようなパスかについては、日本語版Wikipediaの
+特別ページ → ページの書き出し
+などを参照ください。</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Name" xml:space="preserve">
+    <value>labelExportPath</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelExportPath.ZOrder" xml:space="preserve">
+    <value>13</value>
+  </data>
+  <data name="textBoxNamespacePath.Location" type="System.Drawing.Point, System.Drawing">
+    <value>81, 109</value>
+  </data>
+  <data name="textBoxNamespacePath.MaxLength" type="System.Int32, mscorlib">
+    <value>2083</value>
+  </data>
+  <data name="textBoxNamespacePath.Size" type="System.Drawing.Size, System.Drawing">
+    <value>174, 19</value>
+  </data>
+  <data name="textBoxNamespacePath.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="textBoxNamespacePath.ToolTip" xml:space="preserve">
+    <value>サーバーから名前空間の情報をXMLでダウンロードするためのパスを入力します。
+
+どのようなパスかについては、下記URL等を参照してください。
+http://www.mediawiki.org/wiki/API:Main_page/ja</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Name" xml:space="preserve">
+    <value>textBoxNamespacePath</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxNamespacePath.ZOrder" xml:space="preserve">
+    <value>14</value>
+  </data>
+  <data name="labelNamespacePath.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelNamespacePath.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 94</value>
+  </data>
+  <data name="labelNamespacePath.Size" type="System.Drawing.Size, System.Drawing">
+    <value>162, 12</value>
+  </data>
+  <data name="labelNamespacePath.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="labelNamespacePath.Text" xml:space="preserve">
+    <value>名前空間情報取得用のAPIパス:</value>
+  </data>
+  <data name="labelNamespacePath.ToolTip" xml:space="preserve">
+    <value>サーバーから名前空間の情報をXMLでダウンロードするためのパスを入力します。
+
+どのようなパスかについては、下記URL等を参照してください。
+http://www.mediawiki.org/wiki/API:Main_page/ja</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Name" xml:space="preserve">
+    <value>labelNamespacePath</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelNamespacePath.ZOrder" xml:space="preserve">
+    <value>15</value>
+  </data>
+  <data name="textBoxLocation.Location" type="System.Drawing.Point, System.Drawing">
+    <value>81, 18</value>
+  </data>
+  <data name="textBoxLocation.MaxLength" type="System.Int32, mscorlib">
+    <value>300</value>
+  </data>
+  <data name="textBoxLocation.Size" type="System.Drawing.Size, System.Drawing">
+    <value>174, 19</value>
+  </data>
+  <data name="textBoxLocation.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="textBoxLocation.ToolTip" xml:space="preserve">
+    <value>サーバーのURLを入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Name" xml:space="preserve">
+    <value>textBoxLocation</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;textBoxLocation.ZOrder" xml:space="preserve">
+    <value>16</value>
+  </data>
+  <data name="labelLocation.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelLocation.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 22</value>
+  </data>
+  <data name="labelLocation.Size" type="System.Drawing.Size, System.Drawing">
+    <value>69, 12</value>
+  </data>
+  <data name="labelLocation.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelLocation.Text" xml:space="preserve">
+    <value>サーバーURL:</value>
+  </data>
+  <data name="labelLocation.ToolTip" xml:space="preserve">
+    <value>サーバーのURLを入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Name" xml:space="preserve">
+    <value>labelLocation</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;labelLocation.ZOrder" xml:space="preserve">
+    <value>17</value>
+  </data>
+  <data name="comboBoxLanguage.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="comboBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>57, 13</value>
+  </data>
+  <data name="comboBoxLanguage.MaxLength" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="comboBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>85, 20</value>
+  </data>
+  <data name="comboBoxLanguage.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="comboBoxLanguage.ToolTip" xml:space="preserve">
+    <value>設定を変更したい言語を選択します。
+新しい言語を追加するときは、直接言語コードを入力してください。</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Name" xml:space="preserve">
+    <value>comboBoxLanguage</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;comboBoxLanguage.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="labelLanguage.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelLanguage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>20, 16</value>
+  </data>
+  <data name="labelLanguage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>31, 12</value>
+  </data>
+  <data name="labelLanguage.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelLanguage.Text" xml:space="preserve">
+    <value>言語:</value>
+  </data>
+  <data name="labelLanguage.ToolTip" xml:space="preserve">
+    <value>設定を変更したい言語を選択します。
+新しい言語を追加するときは、直接言語コードを入力してください。</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Name" xml:space="preserve">
+    <value>labelLanguage</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.Parent" xml:space="preserve">
+    <value>tabPageServer</value>
+  </data>
+  <data name="&gt;&gt;labelLanguage.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="groupBoxInformation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Name" xml:space="preserve">
+    <value>labelWebsite</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Name" xml:space="preserve">
+    <value>linkLabelWebsite</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Name" xml:space="preserve">
+    <value>labelCopyright</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Name" xml:space="preserve">
+    <value>labelApplicationName</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="groupBoxInformation.Location" type="System.Drawing.Point, System.Drawing">
+    <value>9, 189</value>
+  </data>
+  <data name="groupBoxInformation.Size" type="System.Drawing.Size, System.Drawing">
+    <value>577, 169</value>
+  </data>
+  <data name="groupBoxInformation.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="groupBoxInformation.Text" xml:space="preserve">
+    <value>バージョン情報</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Name" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.Parent" xml:space="preserve">
+    <value>tabPageApplication</value>
+  </data>
+  <data name="&gt;&gt;groupBoxInformation.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="labelWebsite.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelWebsite.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 67</value>
+  </data>
+  <data name="labelWebsite.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 12</value>
+  </data>
+  <data name="labelWebsite.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="labelWebsite.Text" xml:space="preserve">
+    <value>配布元:</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Name" xml:space="preserve">
+    <value>labelWebsite</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelWebsite.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="linkLabelWebsite.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="linkLabelWebsite.Location" type="System.Drawing.Point, System.Drawing">
+    <value>61, 67</value>
+  </data>
+  <data name="linkLabelWebsite.Size" type="System.Drawing.Size, System.Drawing">
+    <value>166, 12</value>
+  </data>
+  <data name="linkLabelWebsite.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="linkLabelWebsite.Text" xml:space="preserve">
+    <value>http://honeplus.blog50.fc2.com/</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Name" xml:space="preserve">
+    <value>linkLabelWebsite</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;linkLabelWebsite.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="labelCopyright.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelCopyright.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 45</value>
+  </data>
+  <data name="labelCopyright.Size" type="System.Drawing.Size, System.Drawing">
+    <value>252, 12</value>
+  </data>
+  <data name="labelCopyright.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="labelCopyright.Text" xml:space="preserve">
+    <value>Copyright (C) Honeplus 2011 ※AssemblyInfo.cs</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Name" xml:space="preserve">
+    <value>labelCopyright</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelCopyright.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="labelApplicationName.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelApplicationName.Font" type="System.Drawing.Font, System.Drawing">
+    <value>MS UI Gothic, 9pt, style=Bold</value>
+  </data>
+  <data name="labelApplicationName.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 24</value>
+  </data>
+  <data name="labelApplicationName.Size" type="System.Drawing.Size, System.Drawing">
+    <value>373, 12</value>
+  </data>
+  <data name="labelApplicationName.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelApplicationName.Text" xml:space="preserve">
+    <value>Wikipdia翻訳支援ツール Ver1.00 ※FormUtil.ApplicationName()</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Name" xml:space="preserve">
+    <value>labelApplicationName</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.Parent" xml:space="preserve">
+    <value>groupBoxInformation</value>
+  </data>
+  <data name="&gt;&gt;labelApplicationName.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="groupBoxApplicationConfig.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.Name" xml:space="preserve">
+    <value>checkBoxIgnoreError</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.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;checkBoxIgnoreError.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Name" xml:space="preserve">
+    <value>labelRefererNote</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Name" xml:space="preserve">
+    <value>labelUserAgentNote</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Name" xml:space="preserve">
+    <value>labelChaceNote</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Name" xml:space="preserve">
+    <value>textBoxCacheExpire</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Name" xml:space="preserve">
+    <value>textBoxReferer</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Name" xml:space="preserve">
+    <value>labelReferer</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Name" xml:space="preserve">
+    <value>labelCacheExpire</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Name" xml:space="preserve">
+    <value>textBoxUserAgent</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Name" xml:space="preserve">
+    <value>labelUserAgent</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="groupBoxApplicationConfig.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 6</value>
+  </data>
+  <data name="groupBoxApplicationConfig.Size" type="System.Drawing.Size, System.Drawing">
+    <value>580, 177</value>
+  </data>
+  <data name="groupBoxApplicationConfig.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="groupBoxApplicationConfig.Text" xml:space="preserve">
+    <value>アプリケーションの設定</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Name" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.Parent" xml:space="preserve">
+    <value>tabPageApplication</value>
+  </data>
+  <data name="&gt;&gt;groupBoxApplicationConfig.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="checkBoxIgnoreError.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="checkBoxIgnoreError.Location" type="System.Drawing.Point, System.Drawing">
+    <value>10, 99</value>
+  </data>
+  <data name="checkBoxIgnoreError.Size" type="System.Drawing.Size, System.Drawing">
+    <value>333, 16</value>
+  </data>
+  <data name="checkBoxIgnoreError.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
+  </data>
+  <data name="checkBoxIgnoreError.Text" xml:space="preserve">
+    <value>エラーを可能な限り無視する(※現在はほとんど機能していません)</value>
+  </data>
+  <data name="checkBoxIgnoreError.ToolTip" xml:space="preserve">
+    <value>エラーが発生した際に、無視して可能な限り処理を続行したい場合、チェックします。
+※ 現在はほとんど機能していません。</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.Name" xml:space="preserve">
+    <value>checkBoxIgnoreError</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.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;checkBoxIgnoreError.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;checkBoxIgnoreError.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="labelRefererNote.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelRefererNote.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="labelRefererNote.Location" type="System.Drawing.Point, System.Drawing">
+    <value>289, 71</value>
+  </data>
+  <data name="labelRefererNote.Size" type="System.Drawing.Size, System.Drawing">
+    <value>189, 12</value>
+  </data>
+  <data name="labelRefererNote.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="labelRefererNote.Text" xml:space="preserve">
+    <value>(空欄:なし ※現在のバージョンでは空)</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Name" xml:space="preserve">
+    <value>labelRefererNote</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelRefererNote.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="labelUserAgentNote.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelUserAgentNote.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="labelUserAgentNote.Location" type="System.Drawing.Point, System.Drawing">
+    <value>289, 46</value>
+  </data>
+  <data name="labelUserAgentNote.Size" type="System.Drawing.Size, System.Drawing">
+    <value>99, 12</value>
+  </data>
+  <data name="labelUserAgentNote.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="labelUserAgentNote.Text" xml:space="preserve">
+    <value>(空欄:デフォルト値)</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Name" xml:space="preserve">
+    <value>labelUserAgentNote</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgentNote.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="labelChaceNote.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelChaceNote.Location" type="System.Drawing.Point, System.Drawing">
+    <value>183, 18</value>
+  </data>
+  <data name="labelChaceNote.Size" type="System.Drawing.Size, System.Drawing">
+    <value>49, 12</value>
+  </data>
+  <data name="labelChaceNote.TabIndex" type="System.Int32, mscorlib">
+    <value>7</value>
+  </data>
+  <data name="labelChaceNote.Text" xml:space="preserve">
+    <value>(0:無効)</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Name" xml:space="preserve">
+    <value>labelChaceNote</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelChaceNote.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="textBoxCacheExpire.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="textBoxCacheExpire.Location" type="System.Drawing.Point, System.Drawing">
+    <value>134, 15</value>
+  </data>
+  <data name="textBoxCacheExpire.MaxLength" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="textBoxCacheExpire.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 19</value>
+  </data>
+  <data name="textBoxCacheExpire.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="textBoxCacheExpire.ToolTip" xml:space="preserve">
+    <value>記事の置き換えで取得済みの内容をキャッシュとして使用する有効期限です。
+日数、またはキャッシュしない場合0を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Name" xml:space="preserve">
+    <value>textBoxCacheExpire</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxCacheExpire.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="textBoxReferer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>75, 68</value>
+  </data>
+  <data name="textBoxReferer.MaxLength" type="System.Int32, mscorlib">
+    <value>2083</value>
+  </data>
+  <data name="textBoxReferer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>209, 19</value>
+  </data>
+  <data name="textBoxReferer.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="textBoxReferer.ToolTip" xml:space="preserve">
+    <value>Referer を固定で指定する場合、URLを入力します。
+空欄の場合、Refererは設定しません。
+
+※ 現状、Referer は動的には設定されません。</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Name" xml:space="preserve">
+    <value>textBoxReferer</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxReferer.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="labelReferer.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelReferer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 71</value>
+  </data>
+  <data name="labelReferer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>45, 12</value>
+  </data>
+  <data name="labelReferer.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="labelReferer.Text" xml:space="preserve">
+    <value>Referer:</value>
+  </data>
+  <data name="labelReferer.ToolTip" xml:space="preserve">
+    <value>Referer を固定で指定する場合、URLを入力します。
+空欄の場合、Refererは設定しません。
+
+※ 現状、Referer は動的には設定されません。</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Name" xml:space="preserve">
+    <value>labelReferer</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelReferer.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="labelCacheExpire.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelCacheExpire.Location" type="System.Drawing.Point, System.Drawing">
+    <value>6, 18</value>
+  </data>
+  <data name="labelCacheExpire.Size" type="System.Drawing.Size, System.Drawing">
+    <value>122, 12</value>
+  </data>
+  <data name="labelCacheExpire.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="labelCacheExpire.Text" xml:space="preserve">
+    <value>キャッシュ有効期限(日):</value>
+  </data>
+  <data name="labelCacheExpire.ToolTip" xml:space="preserve">
+    <value>記事の置き換えで取得済みの内容をキャッシュとして使用する有効期限です。
+日数、またはキャッシュしない場合0を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Name" xml:space="preserve">
+    <value>labelCacheExpire</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelCacheExpire.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="textBoxUserAgent.Location" type="System.Drawing.Point, System.Drawing">
+    <value>75, 43</value>
+  </data>
+  <data name="textBoxUserAgent.MaxLength" type="System.Int32, mscorlib">
+    <value>100</value>
+  </data>
+  <data name="textBoxUserAgent.Size" type="System.Drawing.Size, System.Drawing">
+    <value>209, 19</value>
+  </data>
+  <data name="textBoxUserAgent.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="textBoxUserAgent.ToolTip" xml:space="preserve">
+    <value>User Agent として使用する文字列を入力します。
+空欄の場合、このツール独自のUAを使用します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Name" xml:space="preserve">
+    <value>textBoxUserAgent</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;textBoxUserAgent.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="labelUserAgent.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelUserAgent.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 46</value>
+  </data>
+  <data name="labelUserAgent.Size" type="System.Drawing.Size, System.Drawing">
+    <value>61, 12</value>
+  </data>
+  <data name="labelUserAgent.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelUserAgent.Text" xml:space="preserve">
+    <value>UserAgent:</value>
+  </data>
+  <data name="labelUserAgent.ToolTip" xml:space="preserve">
+    <value>User Agent として使用する文字列を入力します。
+空欄の場合、このツール独自のUAを使用します。</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Name" xml:space="preserve">
+    <value>labelUserAgent</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.Parent" xml:space="preserve">
+    <value>groupBoxApplicationConfig</value>
+  </data>
+  <data name="&gt;&gt;labelUserAgent.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 12</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>624, 443</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAABADoAgAAJgAAABAQEAAAAAQAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAC7sAAAAAAAAAAAAAAAAAAAu7sAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAABEAAAAAuwAAu7sLsAAA
+        AAAREAAAALsAC7u7u7AAAAAAAREAAAC7AAuwAAuwAREREREREAAAuwALsAALsAERERERERAAALsAALsA
+        C7AAAAAAAREAAAC7AAALu7uwAAAAABEQAAAAuwAAsAALsAAAAAARAAAAu7sAALu7u7AAAAAAAAAAALu7
+        AAC7u7sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAAAAA
+        AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7uwALsAALsAAAAAAAAAC7
+        u7uwC7AAC7AAAAAAAAALuwAAsAuwAAuwAAAAAAAAC7AAAAALsAALsAAAAAAAAAu7u7uwC7AAC7AAAAAA
+        AAALsAALsAuwAAuwAAAAAAAAC7sAC7ALsAALsAAAAAAAAAC7u7sAC7u7u7AAAAAAAAAAC7uwAAuwu7sA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        /////x////8P////z///P88J/x/OAf+PznmAB855gAfPOf+Pz4H/H895/z8PAf//DwP/////////////
+        z////8/////////////g55//wGef/49nn/+f55//gGef/55nn/+OZ5//wOAf/+HkP///////////////
+        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3
+        d3dERERERERER0////////hHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//
+        //////hHT///////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==
+</value>
+  </data>
+  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
+    <value>640, 480</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>設定</value>
+  </data>
+  <data name="&gt;&gt;ColumnCode.Name" xml:space="preserve">
+    <value>ColumnCode</value>
+  </data>
+  <data name="&gt;&gt;ColumnCode.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnName.Name" xml:space="preserve">
+    <value>ColumnName</value>
+  </data>
+  <data name="&gt;&gt;ColumnName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnShortName.Name" xml:space="preserve">
+    <value>ColumnShortName</value>
+  </data>
+  <data name="&gt;&gt;ColumnShortName.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;errorProvider.Name" xml:space="preserve">
+    <value>errorProvider</value>
+  </data>
+  <data name="&gt;&gt;errorProvider.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ErrorProvider, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;toolTip.Name" xml:space="preserve">
+    <value>toolTip</value>
+  </data>
+  <data name="&gt;&gt;toolTip.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnFromCode.Name" xml:space="preserve">
+    <value>ColumnFromCode</value>
+  </data>
+  <data name="&gt;&gt;ColumnFromCode.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnFromTitle.Name" xml:space="preserve">
+    <value>ColumnFromTitle</value>
+  </data>
+  <data name="&gt;&gt;ColumnFromTitle.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnAlias.Name" xml:space="preserve">
+    <value>ColumnAlias</value>
+  </data>
+  <data name="&gt;&gt;ColumnAlias.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnArrow.Name" xml:space="preserve">
+    <value>ColumnArrow</value>
+  </data>
+  <data name="&gt;&gt;ColumnArrow.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnToCode.Name" xml:space="preserve">
+    <value>ColumnToCode</value>
+  </data>
+  <data name="&gt;&gt;ColumnToCode.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnToTitle.Name" xml:space="preserve">
+    <value>ColumnToTitle</value>
+  </data>
+  <data name="&gt;&gt;ColumnToTitle.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ColumnTimestamp.Name" xml:space="preserve">
+    <value>ColumnTimestamp</value>
+  </data>
+  <data name="&gt;&gt;ColumnTimestamp.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>ConfigForm</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
 </root>
\ No newline at end of file
index 47b9cf5..86a22f4 100644 (file)
@@ -1,50 +1,50 @@
-Copyright (c) 2009, Honeplus\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are met:\r
-\r
-1. Redistributions of source code must retain the above copyright notice,\r
-   this list of conditions and the following disclaimer.\r
-2. Redistributions in binary form must reproduce the above copyright notice,\r
-   this list of conditions and the following disclaimer in the documentation\r
-   and/or other materials provided with the distribution.\r
-3. The names of its contributors may be used to endorse or promote products\r
-   derived from this software without specific prior written permission.\r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r
-THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-\r
-Copyright (c) 2009, Honeplus\r
-All rights reserved.\r
-\r
-ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満た\r
-す場合に限り、再頒布および使用が許可されます。 \r
-\r
-・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条\r
-  項を含めること。 \r
-・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著\r
-  作権表示、本条件一覧、および下記免責条項を含めること。\r
-・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促\r
-  進に、コントリビューターの名前を使用してはならない。\r
-\r
-本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供さ\r
-れており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性\r
-に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。\r
-著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを\r
-問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為\r
-であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、\r
-本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪\r
-失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損\r
-害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、\r
-一切責任を負わないものとします。\r
+Copyright (c) 2009, Honeplus
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+3. The names of its contributors may be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Copyright (c) 2009, Honeplus
+All rights reserved.
+
+ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満た
+す場合に限り、再頒布および使用が許可されます。 
+
+・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条
+  項を含めること。 
+・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著
+  作権表示、本条件一覧、および下記免責条項を含めること。
+・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促
+  進に、コントリビューターの名前を使用してはならない。
+
+本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供さ
+れており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性
+に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。
+著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを
+問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為
+であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、
+本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪
+失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損
+害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、
+一切責任を負わないものとします。
index 6517dbc..a05f010 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia用の翻訳支援処理実装クラスソース</summary>\r
-//\r
-// <copyright file="MediaWikiTranslator.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Logics\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Net;\r
-    using System.Text;\r
-    using System.Windows.Forms;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Models;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// Wikipedia用の翻訳支援処理実装クラスです。\r
-    /// </summary>\r
-    public class MediaWikiTranslator : Translator\r
-    {\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// 翻訳元言語のサイト。\r
-        /// </summary>\r
-        public new MediaWiki From\r
-        {\r
-            get\r
-            {\r
-                return base.From as MediaWiki;\r
-            }\r
-\r
-            set\r
-            {\r
-                base.From = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先言語のサイト。\r
-        /// </summary>\r
-        public new MediaWiki To\r
-        {\r
-            get\r
-            {\r
-                return base.To as MediaWiki;\r
-            }\r
-\r
-            set\r
-            {\r
-                base.To = value;\r
-            }\r
-        }\r
-        \r
-        #endregion\r
-\r
-        #region 整理予定の静的メソッド\r
-\r
-        /// <summary>\r
-        /// コメント区間のチェック。\r
-        /// </summary>\r
-        /// <param name="comment">解析したコメント。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <returns>コメント区間の場合、終了位置のインデックスを返す。それ以外は-1。</returns>\r
-        public static int ChkComment(out string comment, string text, int index)\r
-        {\r
-            // 入力値確認\r
-            if (String.IsNullOrEmpty(text))\r
-            {\r
-                comment = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            // 改良版メソッドをコール\r
-            if (!LazyXmlParser.TryParseComment(text.Substring(index), out comment))\r
-            {\r
-                comment = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            return index + comment.Length - 1;\r
-        }\r
-\r
-        /// <summary>\r
-        /// nowiki区間のチェック。\r
-        /// </summary>\r
-        /// <param name="nowiki">解析したnowikiブロック。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <returns>nowiki区間の場合、終了位置のインデックスを返す。それ以外は-1。</returns>\r
-        public static int ChkNowiki(out string nowiki, string text, int index)\r
-        {\r
-            // 入力値確認\r
-            if (String.IsNullOrEmpty(text))\r
-            {\r
-                nowiki = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            // 改良版メソッドをコール\r
-            if (!MediaWikiPage.TryParseNowiki(text.Substring(index), out nowiki))\r
-            {\r
-                nowiki = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            return index + nowiki.Length - 1;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region メイン処理メソッド\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理実行部の本体。\r
-        /// ※継承クラスでは、この関数に処理を実装すること\r
-        /// </summary>\r
-        /// <param name="name">記事名。</param>\r
-        /// <returns><c>true</c> 処理成功。</returns>\r
-        protected override bool RunBody(string name)\r
-        {\r
-            System.Diagnostics.Debug.WriteLine("\nMediaWikiTranslator.runBody > " + name);\r
-\r
-            // 対象記事を取得\r
-            MediaWikiPage article = this.ChkTargetArticle(name);\r
-            if (article == null)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 対象記事に言語間リンクが存在する場合、処理を継続するか確認\r
-            string interWiki = article.GetInterWiki(this.To.Language.Code);\r
-            if (interWiki != String.Empty)\r
-            {\r
-                if (MessageBox.Show(\r
-                        String.Format(Resources.QuestionMessage_ArticleExist, interWiki),\r
-                        Resources.QuestionTitle,\r
-                        MessageBoxButtons.YesNo,\r
-                        MessageBoxIcon.Question)\r
-                   == System.Windows.Forms.DialogResult.No)\r
-                {\r
-                    this.LogLine(ENTER + String.Format(Resources.QuestionMessage_ArticleExist, interWiki));\r
-                    return false;\r
-                }\r
-                else\r
-                {\r
-                    this.LogLine(Resources.RightArrow + " " + String.Format(Resources.LogMessage_ArticleExistInterWiki, interWiki));\r
-                }\r
-            }\r
-\r
-            // 冒頭部を作成\r
-            this.Text += "'''xxx'''";\r
-            string bracket = this.To.Language.Bracket;\r
-            if (bracket.Contains("{0}"))\r
-            {\r
-                string originalName = String.Empty;\r
-                string langTitle = this.GetFullName(this.From, this.To.Language.Code);\r
-                if (langTitle != String.Empty)\r
-                {\r
-                    originalName = "[[" + langTitle + "]]: ";\r
-                }\r
-\r
-                this.Text += String.Format(bracket, originalName + "'''" + name + "'''");\r
-            }\r
-\r
-            this.Text += "\n\n";\r
-\r
-            // 言語間リンク・定型句の変換\r
-            this.LogLine(ENTER + Resources.RightArrow + " " + String.Format(Resources.LogMessage_CheckAndReplaceStart, interWiki));\r
-            this.Text += this.ReplaceText(article.Text, article.Title);\r
-\r
-            // ユーザーからの中止要求をチェック\r
-            if (CancellationPending)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 新しい言語間リンクと、コメントを追記\r
-            this.Text += "\n\n[[" + this.From.Language.Code + ":" + name + "]]\n";\r
-            this.Text += String.Format(\r
-                Resources.ArticleFooter,\r
-                FormUtils.ApplicationName(),\r
-                this.From.Language.Code,\r
-                name,\r
-                article.Timestamp.HasValue ? article.Timestamp.Value.ToString("U") : String.Empty) + "\n";\r
-\r
-            // ダウンロードされるテキストがLFなので、ここで全てCRLFに変換\r
-            // ※ダウンロード時にCRLFにするような仕組みが見つかれば、そちらを使う\r
-            //   その場合、上のように\nをべたに吐いている部分を修正する\r
-            this.Text = this.Text.Replace("\n", ENTER);\r
-\r
-            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.runBody > Success!");\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 他のクラスの処理をこのクラスにあわせて拡張したメソッド\r
-\r
-        /// <summary>\r
-        /// ログメッセージを出力しつつページを取得。\r
-        /// </summary>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="notFoundMsg">取得できない場合に出力するメッセージ。</param>\r
-        /// <returns>取得したページ。ページが存在しない場合は <c>null</c> を返す。</returns>\r
-        /// <remarks>通信エラーなど例外が発生した場合は、別途エラーログを出力する。</remarks>\r
-        protected new MediaWikiPage GetPage(string title, string notFoundMsg)\r
-        {\r
-            // 親クラスのメソッドを戻り値の型だけ変更\r
-            return base.GetPage(title, notFoundMsg) as MediaWikiPage;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 各処理のメソッド\r
-        \r
-        /// <summary>\r
-        /// 翻訳支援対象のページを取得。\r
-        /// </summary>\r
-        /// <param name="title">ページ名。</param>\r
-        /// <returns>取得したページ。取得失敗時は<c>null</c>。</returns>\r
-        protected MediaWikiPage ChkTargetArticle(string title)\r
-        {\r
-            // 指定された記事の生データをWikipediaから取得\r
-            this.LogLine(String.Format(Resources.LogMessage_GetArticle, this.From.Location, title));\r
-            MediaWikiPage page = this.GetPage(title, Resources.RightArrow + " " + Resources.LogMessage_ArticleNothing);\r
-\r
-            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得\r
-            if (page != null && page.IsRedirect())\r
-            {\r
-                this.LogLine(Resources.RightArrow + " " + Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]]");\r
-                page = this.GetPage(page.Redirect.Title, Resources.RightArrow + " " + Resources.LogMessage_ArticleNothing);\r
-            }\r
-\r
-            return page;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ログメッセージを出力しつつ、指定された記事の指定された言語コードへの言語間リンクを返す。\r
-        /// </summary>\r
-        /// <param name="title">記事名。</param>\r
-        /// <param name="code">言語コード。</param>\r
-        /// <returns>言語間リンク先の記事名。見つからない場合は空。ページ自体が存在しない場合は<c>null</c>。</returns>\r
-        protected string GetInterWiki(string title, string code)\r
-        {\r
-            MediaWikiPage page = this.GetPage(title, Resources.LogMessage_LinkArticleNothing);\r
-\r
-            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得\r
-            if (page != null && page.IsRedirect())\r
-            {\r
-                this.Log += Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]] " + Resources.RightArrow + " ";\r
-                page = this.GetPage(page.Redirect.Title, Resources.LogMessage_LinkArticleNothing);\r
-            }\r
-\r
-            // 記事があればその言語間リンクを取得\r
-            string interWiki = null;\r
-            if (page != null)\r
-            {\r
-                interWiki = page.GetInterWiki(this.To.Language.Code);\r
-                if (!String.IsNullOrEmpty(interWiki))\r
-                {\r
-                    Log += "[[" + interWiki + "]]";\r
-                }\r
-                else\r
-                {\r
-                    Log += Resources.LogMessage_InterWikiNothing;\r
-                }\r
-            }\r
-\r
-            return interWiki;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ログメッセージを出力しつつ、指定された記事の指定された言語コードへの言語間リンクを返す。\r
-        /// </summary>\r
-        /// <param name="title">記事名。</param>\r
-        /// <param name="code">言語コード。</param>\r
-        /// <returns>言語間リンク先の記事名。見つからない場合は空。ページ自体が存在しない場合は<c>null</c>。</returns>\r
-        /// <remarks>対訳表が指定されている場合、その内容を使用する。また取得結果を対訳表に追加する。</remarks>\r
-        protected string GetInterWikiUseTable(string title, string code)\r
-        {\r
-            if (this.ItemTable == null)\r
-            {\r
-                // 対訳表が指定されていない場合は、普通に記事を取得\r
-                return this.GetInterWiki(title, code);\r
-            }\r
-\r
-            string interWiki = null;\r
-            lock (this.ItemTable)\r
-            {\r
-                TranslationDictionary.Item item;\r
-                if (this.ItemTable.TryGetValue(title, out item))\r
-                {\r
-                    // 対訳表に存在する場合はその値を使用\r
-                    // リダイレクトがあれば、そのメッセージも表示\r
-                    if (!String.IsNullOrWhiteSpace(item.Alias))\r
-                    {\r
-                        this.Log += Resources.LogMessage_Redirect + " [[" + item.Alias + "]] " + Resources.RightArrow + " ";\r
-                    }\r
-\r
-                    if (!String.IsNullOrEmpty(item.Word))\r
-                    {\r
-                        interWiki = item.Word;\r
-                        Log += "[[" + interWiki + "]]";\r
-                    }\r
-                    else\r
-                    {\r
-                        interWiki = String.Empty;\r
-                        Log += Resources.LogMessage_InterWikiNothing;\r
-                    }\r
-\r
-                    Log += Resources.LogMessageTranslation;\r
-                    return interWiki;\r
-                }\r
-\r
-                // 対訳表に存在しない場合は、普通に取得し表に記録\r
-                // ※ nullも存在しないことの記録として格納\r
-                item = new TranslationDictionary.Item { Timestamp = DateTime.UtcNow };\r
-                MediaWikiPage page = this.GetPage(title, Resources.LogMessage_LinkArticleNothing);\r
-\r
-                // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得\r
-                if (page != null && page.IsRedirect())\r
-                {\r
-                    item.Alias = page.Redirect.Title;\r
-                    this.Log += Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]] " + Resources.RightArrow + " ";\r
-                    page = this.GetPage(page.Redirect.Title, Resources.LogMessage_LinkArticleNothing);\r
-                }\r
-\r
-                // 記事があればその言語間リンクを取得\r
-                if (page != null)\r
-                {\r
-                    interWiki = page.GetInterWiki(this.To.Language.Code);\r
-                    if (!String.IsNullOrEmpty(interWiki))\r
-                    {\r
-                        Log += "[[" + interWiki + "]]";\r
-                    }\r
-                    else\r
-                    {\r
-                        Log += Resources.LogMessage_InterWikiNothing;\r
-                    }\r
-\r
-                    item.Word = interWiki;\r
-                    this.ItemTable[title] = item;\r
-                }\r
-            }\r
-\r
-            return interWiki;\r
-        }\r
-        \r
-        /// <summary>\r
-        /// 指定された記事を取得し、言語間リンクを確認、返す。\r
-        /// </summary>\r
-        /// <param name="title">記事名。</param>\r
-        /// <param name="template"><c>true</c> テンプレート。</param>\r
-        /// <returns>言語間リンク先の記事、存在しない場合 <c>null</c>。</returns>\r
-        protected string GetInterWiki(string title, bool template)\r
-        {\r
-            // 指定された記事の生データをWikipediaから取得\r
-            // ※記事自体が存在しない場合、NULLを返す\r
-            if (!template)\r
-            {\r
-                Log += "[[" + title + "]] " + Resources.RightArrow + " ";\r
-            }\r
-            else\r
-            {\r
-                Log += "{{" + title + "}} " + Resources.RightArrow + " ";\r
-            }\r
-\r
-            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得\r
-            string interWiki = this.GetInterWikiUseTable(title, this.To.Language.Code);\r
-\r
-            // 改行が出力されていない場合(正常時)、改行\r
-            if (!Log.EndsWith(ENTER))\r
-            {\r
-                Log += ENTER;\r
-            }\r
-\r
-            return interWiki;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定された記事を取得し、言語間リンクを確認、返す(テンプレート以外)。\r
-        /// </summary>\r
-        /// <param name="name">記事名。</param>\r
-        /// <returns>言語間リンク先の記事、存在しない場合 <c>null</c>。</returns>\r
-        protected string GetInterWiki(string name)\r
-        {\r
-            return this.GetInterWiki(name, false);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストを解析し、言語間リンク・見出し等の変換を行う。\r
-        /// </summary>\r
-        /// <param name="text">記事テキスト。</param>\r
-        /// <param name="parent">元記事タイトル。</param>\r
-        /// <param name="headingEnable">見出しのチェックを行うか?</param>\r
-        /// <returns>変換後の記事テキスト。</returns>\r
-        protected string ReplaceText(string text, string parent, bool headingEnable)\r
-        {\r
-            // 指定された記事の言語間リンク・見出しを探索し、翻訳先言語での名称に変換し、それに置換した文字列を返す\r
-            StringBuilder b = new StringBuilder();\r
-            bool enterFlag = true;\r
-            MediaWikiPage wikiAP = new MediaWikiPage(this.From, "dummy", null);\r
-            for (int i = 0; i < text.Length; i++)\r
-            {\r
-                // ユーザーからの中止要求をチェック\r
-                if (CancellationPending == true)\r
-                {\r
-                    break;\r
-                }\r
-\r
-                char c = text[i];\r
-\r
-                // 見出しも処理対象の場合\r
-                if (headingEnable)\r
-                {\r
-                    // 改行の場合、次のループで見出し行チェックを行う\r
-                    if (c == '\n')\r
-                    {\r
-                        enterFlag = true;\r
-                        b.Append(c);\r
-                        continue;\r
-                    }\r
-\r
-                    // 行の始めでは、その行が見出しの行かのチェックを行う\r
-                    if (enterFlag)\r
-                    {\r
-                        string newTitleLine;\r
-                        int index2 = this.ChkTitleLine(out newTitleLine, text, i);\r
-                        if (index2 != -1)\r
-                        {\r
-                            // 行の終わりまでインデックスを移動\r
-                            i = index2;\r
-\r
-                            // 置き換えられた見出し行を出力\r
-                            b.Append(newTitleLine);\r
-                            continue;\r
-                        }\r
-                        else\r
-                        {\r
-                            enterFlag = false;\r
-                        }\r
-                    }\r
-                }\r
-\r
-                // コメント(<!--)のチェック\r
-                string comment;\r
-                int index = MediaWikiTranslator.ChkComment(out comment, text, i);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-                    b.Append(comment);\r
-                    if (comment.Contains("\n") == true)\r
-                    {\r
-                        enterFlag = true;\r
-                    }\r
-\r
-                    continue;\r
-                }\r
-\r
-                // nowikiのチェック\r
-                string nowiki;\r
-                index = MediaWikiTranslator.ChkNowiki(out nowiki, text, i);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-                    b.Append(nowiki);\r
-                    continue;\r
-                }\r
-\r
-                // 変数({{{1}}}とか)のチェック\r
-                string variable;\r
-                string value;\r
-                index = wikiAP.ChkVariable(out variable, out value, text, i);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-\r
-                    // 変数の | 以降に値が記述されている場合、それに対して再帰的に処理を行う\r
-                    int valueIndex = variable.IndexOf('|');\r
-                    if (valueIndex != -1 && !String.IsNullOrEmpty(value))\r
-                    {\r
-                        variable = variable.Substring(0, valueIndex + 1) + this.ReplaceText(value, parent) + "}}}";\r
-                    }\r
-\r
-                    b.Append(variable);\r
-                    continue;\r
-                }\r
-\r
-                // 内部リンク・テンプレートのチェック&変換、言語間リンクを取得し出力する\r
-                string subtext;\r
-                index = this.ReplaceLink(out subtext, text, i, parent);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-                    b.Append(subtext);\r
-                    continue;\r
-                }\r
-\r
-                // 通常はそのままコピー\r
-                b.Append(text[i]);\r
-            }\r
-\r
-            return b.ToString();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストを解析し、言語間リンク・見出し等の変換を行う。\r
-        /// </summary>\r
-        /// <param name="text">記事テキスト。</param>\r
-        /// <param name="parent">元記事タイトル。</param>\r
-        /// <returns>変換後の記事テキスト。</returns>\r
-        protected string ReplaceText(string text, string parent)\r
-        {\r
-            return this.ReplaceText(text, parent, true);\r
-        }\r
-\r
-        /// <summary>\r
-        /// リンクの解析・置換を行う。\r
-        /// </summary>\r
-        /// <param name="link">解析したリンク。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <param name="parent">元記事タイトル。</param>\r
-        /// <returns>リンクの場合、終了位置のインデックスを返す。それ以外は-1。</returns>\r
-        protected int ReplaceLink(out string link, string text, int index, string parent)\r
-        {\r
-            // 出力値初期化\r
-            int lastIndex = -1;\r
-            link = String.Empty;\r
-            MediaWikiPage.Link l;\r
-\r
-            // 内部リンク・テンプレートの確認と解析\r
-            MediaWikiPage wikiAP = new MediaWikiPage(this.From, "dummy", null);\r
-            lastIndex = wikiAP.ChkLinkText(out l, text, index);\r
-            if (lastIndex != -1)\r
-            {\r
-                // 記事名に変数が使われている場合があるので、そのチェックと展開\r
-                int subindex = l.Title.IndexOf("{{{");\r
-                if (subindex != -1)\r
-                {\r
-                    string variable;\r
-                    string value;\r
-                    int lastIndex2 = wikiAP.ChkVariable(out variable, out value, l.Title, subindex);\r
-                    if (lastIndex2 != -1 && !String.IsNullOrEmpty(value))\r
-                    {\r
-                        // 変数の | 以降に値が記述されている場合、それに置き換える\r
-                        string newArticle = l.Title.Substring(0, subindex) + value;\r
-                        if (lastIndex2 + 1 < l.Title.Length)\r
-                        {\r
-                            newArticle += l.Title.Substring(lastIndex2 + 1);\r
-                        }\r
-\r
-                        l.Title = newArticle;\r
-                    }\r
-                    else\r
-                    {\r
-                        // 値が設定されていない場合、処理してもしょうがないので、除外\r
-                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceLink > 対象外 : " + l.OriginalText);\r
-                        return -1;\r
-                    }\r
-                }\r
-\r
-                string newText = null;\r
-\r
-                // 内部リンクの場合\r
-                if (text[index] == '[')\r
-                {\r
-                    // 内部リンクの変換後文字列を取得\r
-                    newText = this.ReplaceInnerLink(l, parent);\r
-                }\r
-                else if (text[index] == '{')\r
-                {\r
-                    // テンプレートの場合\r
-                    // テンプレートの変換後文字列を取得\r
-                    newText = this.ReplaceTemplate(l, parent);\r
-                }\r
-                else\r
-                {\r
-                    // 上記以外の場合は、対象外\r
-                    System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceLink > プログラムミス : " + l.OriginalText);\r
-                }\r
-\r
-                // 変換後文字列がNULL以外\r
-                if (newText != null)\r
-                {\r
-                    link = newText;\r
-                }\r
-                else\r
-                {\r
-                    lastIndex = -1;\r
-                }\r
-            }\r
-\r
-            return lastIndex;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 内部リンクの文字列を変換する。\r
-        /// </summary>\r
-        /// <param name="link">変換元リンク文字列。</param>\r
-        /// <param name="parent">元記事タイトル。</param>\r
-        /// <returns>変換済みリンク文字列。</returns>\r
-        protected string ReplaceInnerLink(MediaWikiPage.Link link, string parent)\r
-        {\r
-            // 変数初期設定\r
-            StringBuilder b = new StringBuilder("[[");\r
-            string comment = String.Empty;\r
-            MediaWikiPage.Link l = link;\r
-\r
-            // 記事内を指している場合([[#関連項目]]だけとか)以外\r
-            if (!String.IsNullOrEmpty(l.Title) &&\r
-               !(l.Title == parent && String.IsNullOrEmpty(l.Code) && !String.IsNullOrEmpty(l.Section)))\r
-            {\r
-                // 変換の対象外とするリンクかをチェック\r
-                MediaWikiPage article = new MediaWikiPage(this.From, l.Title);\r
-\r
-                // サブページの場合、記事名を補填\r
-                if (l.IsSubpage)\r
-                {\r
-                    l.Title = parent + l.Title;\r
-                }\r
-                else if (!String.IsNullOrEmpty(l.Code))\r
-                {\r
-                    // 言語間リンク・姉妹プロジェクトへのリンクは対象外\r
-                    // 先頭が : でない、翻訳先言語への言語間リンクの場合\r
-                    if (!l.IsColon && l.Code == this.To.Language.Code)\r
-                    {\r
-                        // 削除する。正常終了で、置換後文字列なしを返す\r
-                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > " + l.OriginalText + " を削除");\r
-                        return String.Empty;\r
-                    }\r
-\r
-                    // それ以外は対象外\r
-                    System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > 対象外 : " + l.OriginalText);\r
-                    return null;\r
-                }\r
-                else if (article.IsFile())\r
-                {\r
-                    // 画像も対象外だが、名前空間だけ翻訳先言語の書式に変換\r
-                    return this.ReplaceFileLink(l);\r
-                }\r
-\r
-                // リンクを辿り、対象記事の言語間リンクを取得\r
-                string interWiki = this.GetInterWiki(l.Title);\r
-\r
-                // 記事自体が存在しない(赤リンク)場合、リンクはそのまま\r
-                if (interWiki == null)\r
-                {\r
-                    b.Append(l.Title);\r
-                }\r
-                else if (interWiki == String.Empty)\r
-                {\r
-                    // 言語間リンクが存在しない場合、[[:en:xxx]]みたいな形式に置換\r
-                    b.Append(":");\r
-                    b.Append(this.From.Language.Code);\r
-                    b.Append(":");\r
-                    b.Append(l.Title);\r
-                }\r
-                else\r
-                {\r
-                    // 言語間リンクが存在する場合、そちらを指すように置換\r
-                    // 前の文字列を復元\r
-                    if (l.IsSubpage)\r
-                    {\r
-                        int index = interWiki.IndexOf('/');\r
-                        if (index == -1)\r
-                        {\r
-                            index = 0;\r
-                        }\r
-\r
-                        b.Append(interWiki.Substring(index));\r
-                    }\r
-                    else if (l.IsColon)\r
-                    {\r
-                        b.Append(":");\r
-                        b.Append(interWiki);\r
-                    }\r
-                    else\r
-                    {\r
-                        b.Append(interWiki);\r
-                    }\r
-                }\r
-\r
-                // カテゴリーの場合は、コメントで元の文字列を追加する\r
-                if (article.IsCategory() && !l.IsColon)\r
-                {\r
-                    comment = "<!-- " + l.OriginalText + " -->";\r
-\r
-                    // カテゴリーで[[:en:xxx]]みたいな形式にした場合、| 以降は不要なので削除\r
-                    if (interWiki == String.Empty)\r
-                    {\r
-                        l.PipeTexts = new List<string>();\r
-                    }\r
-                }\r
-                else if (l.PipeTexts.Count == 0 && interWiki != null)\r
-                {\r
-                    // 表示名が存在しない場合、元の名前を表示名に設定\r
-                    l.PipeTexts.Add(article.Title);\r
-                }\r
-            }\r
-\r
-            // 見出し([[#関連項目]]とか)を出力\r
-            if (!String.IsNullOrEmpty(l.Section))\r
-            {\r
-                // 見出しは、定型句変換を通す\r
-                string heading = this.GetHeading(l.Section);\r
-                b.Append("#");\r
-                b.Append(heading != null ? heading : l.Section);\r
-            }\r
-\r
-            // 表示名を出力\r
-            foreach (string text in l.PipeTexts)\r
-            {\r
-                b.Append("|");\r
-                if (!String.IsNullOrEmpty(text))\r
-                {\r
-                    // 画像の場合、| の後に内部リンクやテンプレートが書かれている場合があるが、\r
-                    // 画像は処理対象外でありその中のリンクは個別に再度処理されるため、ここでは特に何もしない\r
-                    b.Append(text);\r
-                }\r
-            }\r
-\r
-            // リンクを閉じる\r
-            b.Append("]]");\r
-\r
-            // コメントを付加\r
-            if (comment != String.Empty)\r
-            {\r
-                b.Append(comment);\r
-            }\r
-\r
-            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > " + l.OriginalText);\r
-            return b.ToString();\r
-        }\r
-\r
-        /// <summary>\r
-        /// テンプレートの文字列を変換する。\r
-        /// </summary>\r
-        /// <param name="link">変換元テンプレート文字列。</param>\r
-        /// <param name="parent">元記事タイトル。</param>\r
-        /// <returns>変換済みテンプレート文字列。</returns>\r
-        protected string ReplaceTemplate(MediaWikiPage.Link link, string parent)\r
-        {\r
-            // 変数初期設定\r
-            MediaWikiPage.Link l = link;\r
-\r
-            // テンプレートは記事名が必須\r
-            if (String.IsNullOrEmpty(l.Title))\r
-            {\r
-                System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > 対象外 : " + l.OriginalText);\r
-                return null;\r
-            }\r
-\r
-            // システム変数の場合は対象外\r
-            if (this.From.IsMagicWord(l.Title))\r
-            {\r
-                System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > システム変数 : " + l.OriginalText);\r
-                return null;\r
-            }\r
-\r
-            // テンプレート名前空間か、普通の記事かを判定\r
-            if (!l.IsColon && !l.IsSubpage)\r
-            {\r
-                string prefix = null;\r
-                IList<string> prefixes = this.From.Namespaces[this.From.TemplateNamespace];\r
-                if (prefixes != null && prefixes.Count > 0)\r
-                {\r
-                    prefix = prefixes[0];\r
-                }\r
-\r
-                if (!String.IsNullOrEmpty(prefix) && !l.Title.StartsWith(prefix + ":"))\r
-                {\r
-                    // 頭にTemplate:を付けた記事名でアクセスし、テンプレートが存在するかをチェック\r
-                    string title = prefix + ":" + l.Title;\r
-                    MediaWikiPage page = null;\r
-                    try\r
-                    {\r
-                        page = this.From.GetPage(title) as MediaWikiPage;\r
-                    }\r
-                    catch (WebException e)\r
-                    {\r
-                        if (e.Status == WebExceptionStatus.ProtocolError\r
-                            && (e.Response as HttpWebResponse).StatusCode != HttpStatusCode.NotFound)\r
-                        {\r
-                            // 記事が取得できない場合も、404でない場合は存在するとして処理\r
-                            this.LogLine(String.Format(Resources.LogMessage_TemplateUnknown, l.Title, prefix, e.Message));\r
-                            l.Title = title;\r
-                        }\r
-                    }\r
-                    catch (Exception e)\r
-                    {\r
-                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.ReplaceTemplate > " + e.Message);\r
-                    }\r
-\r
-                    if (page != null)\r
-                    {\r
-                        // 記事が存在する場合、テンプレートをつけた名前を使用\r
-                        l.Title = title;\r
-                    }\r
-                }\r
-            }\r
-            else if (l.IsSubpage)\r
-            {\r
-                // サブページの場合、記事名を補填\r
-                l.Title = parent + l.Title;\r
-            }\r
-\r
-            // リンクを辿り、対象記事の言語間リンクを取得\r
-            string interWiki = this.GetInterWiki(l.Title, true);\r
-\r
-            // 記事自体が存在しない(赤リンク)場合、リンクはそのまま\r
-            StringBuilder b = new StringBuilder();\r
-            if (interWiki == null)\r
-            {\r
-                b.Append(l.OriginalText);\r
-            }\r
-            else if (interWiki == String.Empty)\r
-            {\r
-                // 言語間リンクが存在しない場合、[[:en:Template:xxx]]みたいな普通のリンクに置換\r
-                // おまけで、元のテンプレートの状態をコメントでつける\r
-                b.Append("[[:");\r
-                b.Append(this.From.Language.Code);\r
-                b.Append(":");\r
-                b.Append(l.Title);\r
-                b.Append("]]<!-- ");\r
-                b.Append(l.OriginalText);\r
-                b.Append(" -->");\r
-            }\r
-            else\r
-            {\r
-                // 言語間リンクが存在する場合、そちらを指すように置換\r
-                b.Append("{{");\r
-\r
-                // 前の文字列を復元\r
-                if (l.IsColon)\r
-                {\r
-                    b.Append(":");\r
-                }\r
-\r
-                if (l.IsMsgnw)\r
-                {\r
-                    b.Append(MediaWikiPage.Msgnw);\r
-                }\r
-\r
-                // : より前の部分を削除して出力(: が無いときは-1+1で0から)\r
-                b.Append(interWiki.Substring(interWiki.IndexOf(':') + 1));\r
-\r
-                // 改行を復元\r
-                if (l.Enter)\r
-                {\r
-                    b.Append("\n");\r
-                }\r
-\r
-                // | の後を付加\r
-                foreach (string text in l.PipeTexts)\r
-                {\r
-                    b.Append("|");\r
-                    if (!String.IsNullOrEmpty(text))\r
-                    {\r
-                        // | の後に内部リンクやテンプレートが書かれている場合があるので、再帰的に処理する\r
-                        b.Append(this.ReplaceText(text, parent));\r
-                    }\r
-                }\r
-\r
-                // リンクを閉じる\r
-                b.Append("}}");\r
-            }\r
-\r
-            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > " + l.OriginalText);\r
-            return b.ToString();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたインデックスの位置に存在する見出し(==関連項目==みたいなの)を解析し、可能であれば変換して返す。\r
-        /// </summary>\r
-        /// <param name="heading">変換後の見出し。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <returns>見出しの場合、見出し終了位置のインデックスを返す。それ以外は-1。</returns>\r
-        protected virtual int ChkTitleLine(out string heading, string text, int index)\r
-        {\r
-            // 初期化\r
-            // ※見出しではない、構文がおかしいなどの場合、-1を返す\r
-            int lastIndex = -1;\r
-            \r
-            // 構文を解析して、1行の文字列と、=の個数を取得\r
-            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・\r
-            // ※Wikipediaでは <!--test-.=<!--test-.=関連項目<!--test-.==<!--test-. みたいなのでも\r
-            //   正常に認識するので、できるだけ対応する\r
-            // ※変換が正常に行われた場合、コメントは削除される\r
-            bool startFlag = true;\r
-            int startSignCounter = 0;\r
-            string nonCommentLine = String.Empty;\r
-            StringBuilder b = new StringBuilder();\r
-            for (lastIndex = index; lastIndex < text.Length; lastIndex++)\r
-            {\r
-                char c = text[lastIndex];\r
-\r
-                // 改行まで\r
-                if (c == '\n')\r
-                {\r
-                    break;\r
-                }\r
-\r
-                // コメントは無視する\r
-                string comment;\r
-                int subindex = MediaWikiTranslator.ChkComment(out comment, text, lastIndex);\r
-                if (subindex != -1)\r
-                {\r
-                    b.Append(comment);\r
-                    lastIndex = subindex;\r
-                    continue;\r
-                }\r
-                else if (startFlag)\r
-                {\r
-                    // 先頭部の場合、=の数を数える\r
-                    if (c == '=')\r
-                    {\r
-                        ++startSignCounter;\r
-                    }\r
-                    else\r
-                    {\r
-                        startFlag = false;\r
-                    }\r
-                }\r
-\r
-                nonCommentLine += c;\r
-                b.Append(c);\r
-            }\r
-\r
-            heading = b.ToString();\r
-\r
-            // 改行文字、または文章の最後+1になっているはずなので、1文字戻す\r
-            --lastIndex;\r
-\r
-            // = で始まる行ではない場合、処理対象外\r
-            if (startSignCounter < 1)\r
-            {\r
-                heading = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            // 終わりの = の数を確認\r
-            // ※↓の処理だと中身の無い行(====とか)は弾かれてしまうが、どうせ処理できないので許容する\r
-            int endSignCounter = 0;\r
-            for (int i = nonCommentLine.Length - 1; i >= startSignCounter; i--)\r
-            {\r
-                if (nonCommentLine[i] == '=')\r
-                {\r
-                    ++endSignCounter;\r
-                }\r
-                else\r
-                {\r
-                    break;\r
-                }\r
-            }\r
-\r
-            // = で終わる行ではない場合、処理対象外\r
-            if (endSignCounter < 1)\r
-            {\r
-                heading = String.Empty;\r
-                return -1;\r
-            }\r
-\r
-            // 始まりと終わり、=の少ないほうにあわせる(==test===とか用の処理)\r
-            int signCounter = startSignCounter;\r
-            if (startSignCounter > endSignCounter)\r
-            {\r
-                signCounter = endSignCounter;\r
-            }\r
-\r
-            // 定型句変換\r
-            string oldText = nonCommentLine.Substring(signCounter, nonCommentLine.Length - (signCounter * 2)).Trim();\r
-            string newText = this.GetHeading(oldText);\r
-            if (newText != null)\r
-            {\r
-                string sign = "=";\r
-                for (int i = 1; i < signCounter; i++)\r
-                {\r
-                    sign += "=";\r
-                }\r
-\r
-                string newHeading = sign + newText + sign;\r
-                this.LogLine(ENTER + heading + " " + Resources.RightArrow + " " + newHeading);\r
-                heading = newHeading;\r
-            }\r
-            else\r
-            {\r
-                this.LogLine(ENTER + heading);\r
-            }\r
-\r
-            return lastIndex;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたコードでの見出しに相当する、別の言語での見出しを取得。\r
-        /// </summary>\r
-        /// <param name="heading">翻訳元言語での見出し。</param>\r
-        /// <returns>翻訳先言語での見出し。値が存在しない場合は<c>null</c>。</returns>\r
-        protected string GetHeading(string heading)\r
-        {\r
-            return this.HeadingTable.GetWord(heading);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定した言語での言語名称を ページ名|略称 の形式で取得。\r
-        /// </summary>\r
-        /// <param name="site">サイト。</param>\r
-        /// <param name="code">言語のコード。</param>\r
-        /// <returns>ページ名|略称形式の言語名称。</returns>\r
-        protected string GetFullName(Website site, string code)\r
-        {\r
-            if (site.Language.Names.ContainsKey(code))\r
-            {\r
-                Language.LanguageName name = site.Language.Names[code];\r
-                if (!String.IsNullOrEmpty(name.ShortName))\r
-                {\r
-                    return name.Name + "|" + name.ShortName;\r
-                }\r
-                else\r
-                {\r
-                    return name.Name;\r
-                }\r
-            }\r
-\r
-            return String.Empty;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 画像などのファイルへの内部リンクの置き換えを行う。\r
-        /// </summary>\r
-        /// <param name="link">内部リンク。</param>\r
-        /// <returns>置き換え後のリンク文字列、置き換えを行わない場合<c>null</c>。</returns>\r
-        private string ReplaceFileLink(MediaWikiPage.Link link)\r
-        {\r
-            // 名前空間だけ翻訳先言語の書式に変換\r
-            IList<string> names;\r
-            if (!this.To.Namespaces.TryGetValue(this.To.FileNamespace, out names))\r
-            {\r
-                // 翻訳先言語に相当する名前空間が無い場合、何もしない\r
-                return null;\r
-            }\r
-\r
-            // 記事名の名前空間部分を置き換えて返す\r
-            link.Title = names[0] + link.Title.Substring(link.Title.IndexOf(':'));\r
-            return link.Text;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Wikipedia用の翻訳支援処理実装クラスソース</summary>
+//
+// <copyright file="MediaWikiTranslator.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Logics
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Net;
+    using System.Text;
+    using System.Windows.Forms;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Models;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// Wikipedia用の翻訳支援処理実装クラスです。
+    /// </summary>
+    public class MediaWikiTranslator : Translator
+    {
+        #region プロパティ
+
+        /// <summary>
+        /// 翻訳元言語のサイト。
+        /// </summary>
+        public new MediaWiki From
+        {
+            get
+            {
+                return base.From as MediaWiki;
+            }
+
+            set
+            {
+                base.From = value;
+            }
+        }
+
+        /// <summary>
+        /// 翻訳先言語のサイト。
+        /// </summary>
+        public new MediaWiki To
+        {
+            get
+            {
+                return base.To as MediaWiki;
+            }
+
+            set
+            {
+                base.To = value;
+            }
+        }
+        
+        #endregion
+
+        #region 整理予定の静的メソッド
+
+        /// <summary>
+        /// コメント区間のチェック。
+        /// </summary>
+        /// <param name="comment">解析したコメント。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <returns>コメント区間の場合、終了位置のインデックスを返す。それ以外は-1。</returns>
+        public static int ChkComment(out string comment, string text, int index)
+        {
+            // 入力値確認
+            if (String.IsNullOrEmpty(text))
+            {
+                comment = String.Empty;
+                return -1;
+            }
+
+            // 改良版メソッドをコール
+            if (!LazyXmlParser.TryParseComment(text.Substring(index), out comment))
+            {
+                comment = String.Empty;
+                return -1;
+            }
+
+            return index + comment.Length - 1;
+        }
+
+        /// <summary>
+        /// nowiki区間のチェック。
+        /// </summary>
+        /// <param name="nowiki">解析したnowikiブロック。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <returns>nowiki区間の場合、終了位置のインデックスを返す。それ以外は-1。</returns>
+        public static int ChkNowiki(out string nowiki, string text, int index)
+        {
+            // 入力値確認
+            if (String.IsNullOrEmpty(text))
+            {
+                nowiki = String.Empty;
+                return -1;
+            }
+
+            // 改良版メソッドをコール
+            if (!MediaWikiPage.TryParseNowiki(text.Substring(index), out nowiki))
+            {
+                nowiki = String.Empty;
+                return -1;
+            }
+
+            return index + nowiki.Length - 1;
+        }
+
+        #endregion
+
+        #region メイン処理メソッド
+
+        /// <summary>
+        /// 翻訳支援処理実行部の本体。
+        /// ※継承クラスでは、この関数に処理を実装すること
+        /// </summary>
+        /// <param name="name">記事名。</param>
+        /// <returns><c>true</c> 処理成功。</returns>
+        protected override bool RunBody(string name)
+        {
+            System.Diagnostics.Debug.WriteLine("\nMediaWikiTranslator.runBody > " + name);
+
+            // 対象記事を取得
+            MediaWikiPage article = this.ChkTargetArticle(name);
+            if (article == null)
+            {
+                return false;
+            }
+
+            // 対象記事に言語間リンクが存在する場合、処理を継続するか確認
+            string interWiki = article.GetInterWiki(this.To.Language.Code);
+            if (interWiki != String.Empty)
+            {
+                if (MessageBox.Show(
+                        String.Format(Resources.QuestionMessage_ArticleExist, interWiki),
+                        Resources.QuestionTitle,
+                        MessageBoxButtons.YesNo,
+                        MessageBoxIcon.Question)
+                   == System.Windows.Forms.DialogResult.No)
+                {
+                    this.LogLine(ENTER + String.Format(Resources.QuestionMessage_ArticleExist, interWiki));
+                    return false;
+                }
+                else
+                {
+                    this.LogLine(Resources.RightArrow + " " + String.Format(Resources.LogMessage_ArticleExistInterWiki, interWiki));
+                }
+            }
+
+            // 冒頭部を作成
+            this.Text += "'''xxx'''";
+            string bracket = this.To.Language.Bracket;
+            if (bracket.Contains("{0}"))
+            {
+                string originalName = String.Empty;
+                string langTitle = this.GetFullName(this.From, this.To.Language.Code);
+                if (langTitle != String.Empty)
+                {
+                    originalName = "[[" + langTitle + "]]: ";
+                }
+
+                this.Text += String.Format(bracket, originalName + "'''" + name + "'''");
+            }
+
+            this.Text += "\n\n";
+
+            // 言語間リンク・定型句の変換
+            this.LogLine(ENTER + Resources.RightArrow + " " + String.Format(Resources.LogMessage_CheckAndReplaceStart, interWiki));
+            this.Text += this.ReplaceText(article.Text, article.Title);
+
+            // ユーザーからの中止要求をチェック
+            if (CancellationPending)
+            {
+                return false;
+            }
+
+            // 新しい言語間リンクと、コメントを追記
+            this.Text += "\n\n[[" + this.From.Language.Code + ":" + name + "]]\n";
+            this.Text += String.Format(
+                Resources.ArticleFooter,
+                FormUtils.ApplicationName(),
+                this.From.Language.Code,
+                name,
+                article.Timestamp.HasValue ? article.Timestamp.Value.ToString("U") : String.Empty) + "\n";
+
+            // ダウンロードされるテキストがLFなので、ここで全てCRLFに変換
+            // ※ダウンロード時にCRLFにするような仕組みが見つかれば、そちらを使う
+            //   その場合、上のように\nをべたに吐いている部分を修正する
+            this.Text = this.Text.Replace("\n", ENTER);
+
+            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.runBody > Success!");
+            return true;
+        }
+
+        #endregion
+
+        #region 他のクラスの処理をこのクラスにあわせて拡張したメソッド
+
+        /// <summary>
+        /// ログメッセージを出力しつつページを取得。
+        /// </summary>
+        /// <param name="title">ページタイトル。</param>
+        /// <param name="notFoundMsg">取得できない場合に出力するメッセージ。</param>
+        /// <returns>取得したページ。ページが存在しない場合は <c>null</c> を返す。</returns>
+        /// <remarks>通信エラーなど例外が発生した場合は、別途エラーログを出力する。</remarks>
+        protected new MediaWikiPage GetPage(string title, string notFoundMsg)
+        {
+            // 親クラスのメソッドを戻り値の型だけ変更
+            return base.GetPage(title, notFoundMsg) as MediaWikiPage;
+        }
+
+        #endregion
+
+        #region 各処理のメソッド
+        
+        /// <summary>
+        /// 翻訳支援対象のページを取得。
+        /// </summary>
+        /// <param name="title">ページ名。</param>
+        /// <returns>取得したページ。取得失敗時は<c>null</c>。</returns>
+        protected MediaWikiPage ChkTargetArticle(string title)
+        {
+            // 指定された記事の生データをWikipediaから取得
+            this.LogLine(String.Format(Resources.LogMessage_GetArticle, this.From.Location, title));
+            MediaWikiPage page = this.GetPage(title, Resources.RightArrow + " " + Resources.LogMessage_ArticleNothing);
+
+            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得
+            if (page != null && page.IsRedirect())
+            {
+                this.LogLine(Resources.RightArrow + " " + Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]]");
+                page = this.GetPage(page.Redirect.Title, Resources.RightArrow + " " + Resources.LogMessage_ArticleNothing);
+            }
+
+            return page;
+        }
+
+        /// <summary>
+        /// ログメッセージを出力しつつ、指定された記事の指定された言語コードへの言語間リンクを返す。
+        /// </summary>
+        /// <param name="title">記事名。</param>
+        /// <param name="code">言語コード。</param>
+        /// <returns>言語間リンク先の記事名。見つからない場合は空。ページ自体が存在しない場合は<c>null</c>。</returns>
+        protected string GetInterWiki(string title, string code)
+        {
+            MediaWikiPage page = this.GetPage(title, Resources.LogMessage_LinkArticleNothing);
+
+            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得
+            if (page != null && page.IsRedirect())
+            {
+                this.Log += Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]] " + Resources.RightArrow + " ";
+                page = this.GetPage(page.Redirect.Title, Resources.LogMessage_LinkArticleNothing);
+            }
+
+            // 記事があればその言語間リンクを取得
+            string interWiki = null;
+            if (page != null)
+            {
+                interWiki = page.GetInterWiki(this.To.Language.Code);
+                if (!String.IsNullOrEmpty(interWiki))
+                {
+                    Log += "[[" + interWiki + "]]";
+                }
+                else
+                {
+                    Log += Resources.LogMessage_InterWikiNothing;
+                }
+            }
+
+            return interWiki;
+        }
+
+        /// <summary>
+        /// ログメッセージを出力しつつ、指定された記事の指定された言語コードへの言語間リンクを返す。
+        /// </summary>
+        /// <param name="title">記事名。</param>
+        /// <param name="code">言語コード。</param>
+        /// <returns>言語間リンク先の記事名。見つからない場合は空。ページ自体が存在しない場合は<c>null</c>。</returns>
+        /// <remarks>対訳表が指定されている場合、その内容を使用する。また取得結果を対訳表に追加する。</remarks>
+        protected string GetInterWikiUseTable(string title, string code)
+        {
+            if (this.ItemTable == null)
+            {
+                // 対訳表が指定されていない場合は、普通に記事を取得
+                return this.GetInterWiki(title, code);
+            }
+
+            string interWiki = null;
+            lock (this.ItemTable)
+            {
+                TranslationDictionary.Item item;
+                if (this.ItemTable.TryGetValue(title, out item))
+                {
+                    // 対訳表に存在する場合はその値を使用
+                    // リダイレクトがあれば、そのメッセージも表示
+                    if (!String.IsNullOrWhiteSpace(item.Alias))
+                    {
+                        this.Log += Resources.LogMessage_Redirect + " [[" + item.Alias + "]] " + Resources.RightArrow + " ";
+                    }
+
+                    if (!String.IsNullOrEmpty(item.Word))
+                    {
+                        interWiki = item.Word;
+                        Log += "[[" + interWiki + "]]";
+                    }
+                    else
+                    {
+                        interWiki = String.Empty;
+                        Log += Resources.LogMessage_InterWikiNothing;
+                    }
+
+                    Log += Resources.LogMessageTranslation;
+                    return interWiki;
+                }
+
+                // 対訳表に存在しない場合は、普通に取得し表に記録
+                // ※ nullも存在しないことの記録として格納
+                item = new TranslationDictionary.Item { Timestamp = DateTime.UtcNow };
+                MediaWikiPage page = this.GetPage(title, Resources.LogMessage_LinkArticleNothing);
+
+                // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得
+                if (page != null && page.IsRedirect())
+                {
+                    item.Alias = page.Redirect.Title;
+                    this.Log += Resources.LogMessage_Redirect + " [[" + page.Redirect.Title + "]] " + Resources.RightArrow + " ";
+                    page = this.GetPage(page.Redirect.Title, Resources.LogMessage_LinkArticleNothing);
+                }
+
+                // 記事があればその言語間リンクを取得
+                if (page != null)
+                {
+                    interWiki = page.GetInterWiki(this.To.Language.Code);
+                    if (!String.IsNullOrEmpty(interWiki))
+                    {
+                        Log += "[[" + interWiki + "]]";
+                    }
+                    else
+                    {
+                        Log += Resources.LogMessage_InterWikiNothing;
+                    }
+
+                    item.Word = interWiki;
+                    this.ItemTable[title] = item;
+                }
+            }
+
+            return interWiki;
+        }
+        
+        /// <summary>
+        /// 指定された記事を取得し、言語間リンクを確認、返す。
+        /// </summary>
+        /// <param name="title">記事名。</param>
+        /// <param name="template"><c>true</c> テンプレート。</param>
+        /// <returns>言語間リンク先の記事、存在しない場合 <c>null</c>。</returns>
+        protected string GetInterWiki(string title, bool template)
+        {
+            // 指定された記事の生データをWikipediaから取得
+            // ※記事自体が存在しない場合、NULLを返す
+            if (!template)
+            {
+                Log += "[[" + title + "]] " + Resources.RightArrow + " ";
+            }
+            else
+            {
+                Log += "{{" + title + "}} " + Resources.RightArrow + " ";
+            }
+
+            // リダイレクトかをチェックし、リダイレクトであれば、その先の記事を取得
+            string interWiki = this.GetInterWikiUseTable(title, this.To.Language.Code);
+
+            // 改行が出力されていない場合(正常時)、改行
+            if (!Log.EndsWith(ENTER))
+            {
+                Log += ENTER;
+            }
+
+            return interWiki;
+        }
+
+        /// <summary>
+        /// 指定された記事を取得し、言語間リンクを確認、返す(テンプレート以外)。
+        /// </summary>
+        /// <param name="name">記事名。</param>
+        /// <returns>言語間リンク先の記事、存在しない場合 <c>null</c>。</returns>
+        protected string GetInterWiki(string name)
+        {
+            return this.GetInterWiki(name, false);
+        }
+
+        /// <summary>
+        /// 渡されたテキストを解析し、言語間リンク・見出し等の変換を行う。
+        /// </summary>
+        /// <param name="text">記事テキスト。</param>
+        /// <param name="parent">元記事タイトル。</param>
+        /// <param name="headingEnable">見出しのチェックを行うか?</param>
+        /// <returns>変換後の記事テキスト。</returns>
+        protected string ReplaceText(string text, string parent, bool headingEnable)
+        {
+            // 指定された記事の言語間リンク・見出しを探索し、翻訳先言語での名称に変換し、それに置換した文字列を返す
+            StringBuilder b = new StringBuilder();
+            bool enterFlag = true;
+            MediaWikiPage wikiAP = new MediaWikiPage(this.From, "dummy", null);
+            for (int i = 0; i < text.Length; i++)
+            {
+                // ユーザーからの中止要求をチェック
+                if (CancellationPending == true)
+                {
+                    break;
+                }
+
+                char c = text[i];
+
+                // 見出しも処理対象の場合
+                if (headingEnable)
+                {
+                    // 改行の場合、次のループで見出し行チェックを行う
+                    if (c == '\n')
+                    {
+                        enterFlag = true;
+                        b.Append(c);
+                        continue;
+                    }
+
+                    // 行の始めでは、その行が見出しの行かのチェックを行う
+                    if (enterFlag)
+                    {
+                        string newTitleLine;
+                        int index2 = this.ChkTitleLine(out newTitleLine, text, i);
+                        if (index2 != -1)
+                        {
+                            // 行の終わりまでインデックスを移動
+                            i = index2;
+
+                            // 置き換えられた見出し行を出力
+                            b.Append(newTitleLine);
+                            continue;
+                        }
+                        else
+                        {
+                            enterFlag = false;
+                        }
+                    }
+                }
+
+                // コメント(<!--)のチェック
+                string comment;
+                int index = MediaWikiTranslator.ChkComment(out comment, text, i);
+                if (index != -1)
+                {
+                    i = index;
+                    b.Append(comment);
+                    if (comment.Contains("\n") == true)
+                    {
+                        enterFlag = true;
+                    }
+
+                    continue;
+                }
+
+                // nowikiのチェック
+                string nowiki;
+                index = MediaWikiTranslator.ChkNowiki(out nowiki, text, i);
+                if (index != -1)
+                {
+                    i = index;
+                    b.Append(nowiki);
+                    continue;
+                }
+
+                // 変数({{{1}}}とか)のチェック
+                string variable;
+                string value;
+                index = wikiAP.ChkVariable(out variable, out value, text, i);
+                if (index != -1)
+                {
+                    i = index;
+
+                    // 変数の | 以降に値が記述されている場合、それに対して再帰的に処理を行う
+                    int valueIndex = variable.IndexOf('|');
+                    if (valueIndex != -1 && !String.IsNullOrEmpty(value))
+                    {
+                        variable = variable.Substring(0, valueIndex + 1) + this.ReplaceText(value, parent) + "}}}";
+                    }
+
+                    b.Append(variable);
+                    continue;
+                }
+
+                // 内部リンク・テンプレートのチェック&変換、言語間リンクを取得し出力する
+                string subtext;
+                index = this.ReplaceLink(out subtext, text, i, parent);
+                if (index != -1)
+                {
+                    i = index;
+                    b.Append(subtext);
+                    continue;
+                }
+
+                // 通常はそのままコピー
+                b.Append(text[i]);
+            }
+
+            return b.ToString();
+        }
+
+        /// <summary>
+        /// 渡されたテキストを解析し、言語間リンク・見出し等の変換を行う。
+        /// </summary>
+        /// <param name="text">記事テキスト。</param>
+        /// <param name="parent">元記事タイトル。</param>
+        /// <returns>変換後の記事テキスト。</returns>
+        protected string ReplaceText(string text, string parent)
+        {
+            return this.ReplaceText(text, parent, true);
+        }
+
+        /// <summary>
+        /// リンクの解析・置換を行う。
+        /// </summary>
+        /// <param name="link">解析したリンク。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <param name="parent">元記事タイトル。</param>
+        /// <returns>リンクの場合、終了位置のインデックスを返す。それ以外は-1。</returns>
+        protected int ReplaceLink(out string link, string text, int index, string parent)
+        {
+            // 出力値初期化
+            int lastIndex = -1;
+            link = String.Empty;
+            MediaWikiPage.Link l;
+
+            // 内部リンク・テンプレートの確認と解析
+            MediaWikiPage wikiAP = new MediaWikiPage(this.From, "dummy", null);
+            lastIndex = wikiAP.ChkLinkText(out l, text, index);
+            if (lastIndex != -1)
+            {
+                // 記事名に変数が使われている場合があるので、そのチェックと展開
+                int subindex = l.Title.IndexOf("{{{");
+                if (subindex != -1)
+                {
+                    string variable;
+                    string value;
+                    int lastIndex2 = wikiAP.ChkVariable(out variable, out value, l.Title, subindex);
+                    if (lastIndex2 != -1 && !String.IsNullOrEmpty(value))
+                    {
+                        // 変数の | 以降に値が記述されている場合、それに置き換える
+                        string newArticle = l.Title.Substring(0, subindex) + value;
+                        if (lastIndex2 + 1 < l.Title.Length)
+                        {
+                            newArticle += l.Title.Substring(lastIndex2 + 1);
+                        }
+
+                        l.Title = newArticle;
+                    }
+                    else
+                    {
+                        // 値が設定されていない場合、処理してもしょうがないので、除外
+                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceLink > 対象外 : " + l.OriginalText);
+                        return -1;
+                    }
+                }
+
+                string newText = null;
+
+                // 内部リンクの場合
+                if (text[index] == '[')
+                {
+                    // 内部リンクの変換後文字列を取得
+                    newText = this.ReplaceInnerLink(l, parent);
+                }
+                else if (text[index] == '{')
+                {
+                    // テンプレートの場合
+                    // テンプレートの変換後文字列を取得
+                    newText = this.ReplaceTemplate(l, parent);
+                }
+                else
+                {
+                    // 上記以外の場合は、対象外
+                    System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceLink > プログラムミス : " + l.OriginalText);
+                }
+
+                // 変換後文字列がNULL以外
+                if (newText != null)
+                {
+                    link = newText;
+                }
+                else
+                {
+                    lastIndex = -1;
+                }
+            }
+
+            return lastIndex;
+        }
+
+        /// <summary>
+        /// 内部リンクの文字列を変換する。
+        /// </summary>
+        /// <param name="link">変換元リンク文字列。</param>
+        /// <param name="parent">元記事タイトル。</param>
+        /// <returns>変換済みリンク文字列。</returns>
+        protected string ReplaceInnerLink(MediaWikiPage.Link link, string parent)
+        {
+            // 変数初期設定
+            StringBuilder b = new StringBuilder("[[");
+            string comment = String.Empty;
+            MediaWikiPage.Link l = link;
+
+            // 記事内を指している場合([[#関連項目]]だけとか)以外
+            if (!String.IsNullOrEmpty(l.Title) &&
+               !(l.Title == parent && String.IsNullOrEmpty(l.Code) && !String.IsNullOrEmpty(l.Section)))
+            {
+                // 変換の対象外とするリンクかをチェック
+                MediaWikiPage article = new MediaWikiPage(this.From, l.Title);
+
+                // サブページの場合、記事名を補填
+                if (l.IsSubpage)
+                {
+                    l.Title = parent + l.Title;
+                }
+                else if (!String.IsNullOrEmpty(l.Code))
+                {
+                    // 言語間リンク・姉妹プロジェクトへのリンクは対象外
+                    // 先頭が : でない、翻訳先言語への言語間リンクの場合
+                    if (!l.IsColon && l.Code == this.To.Language.Code)
+                    {
+                        // 削除する。正常終了で、置換後文字列なしを返す
+                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > " + l.OriginalText + " を削除");
+                        return String.Empty;
+                    }
+
+                    // それ以外は対象外
+                    System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > 対象外 : " + l.OriginalText);
+                    return null;
+                }
+                else if (article.IsFile())
+                {
+                    // 画像も対象外だが、名前空間だけ翻訳先言語の書式に変換
+                    return this.ReplaceFileLink(l);
+                }
+
+                // リンクを辿り、対象記事の言語間リンクを取得
+                string interWiki = this.GetInterWiki(l.Title);
+
+                // 記事自体が存在しない(赤リンク)場合、リンクはそのまま
+                if (interWiki == null)
+                {
+                    b.Append(l.Title);
+                }
+                else if (interWiki == String.Empty)
+                {
+                    // 言語間リンクが存在しない場合、[[:en:xxx]]みたいな形式に置換
+                    b.Append(":");
+                    b.Append(this.From.Language.Code);
+                    b.Append(":");
+                    b.Append(l.Title);
+                }
+                else
+                {
+                    // 言語間リンクが存在する場合、そちらを指すように置換
+                    // 前の文字列を復元
+                    if (l.IsSubpage)
+                    {
+                        int index = interWiki.IndexOf('/');
+                        if (index == -1)
+                        {
+                            index = 0;
+                        }
+
+                        b.Append(interWiki.Substring(index));
+                    }
+                    else if (l.IsColon)
+                    {
+                        b.Append(":");
+                        b.Append(interWiki);
+                    }
+                    else
+                    {
+                        b.Append(interWiki);
+                    }
+                }
+
+                // カテゴリーの場合は、コメントで元の文字列を追加する
+                if (article.IsCategory() && !l.IsColon)
+                {
+                    comment = "<!-- " + l.OriginalText + " -->";
+
+                    // カテゴリーで[[:en:xxx]]みたいな形式にした場合、| 以降は不要なので削除
+                    if (interWiki == String.Empty)
+                    {
+                        l.PipeTexts = new List<string>();
+                    }
+                }
+                else if (l.PipeTexts.Count == 0 && interWiki != null)
+                {
+                    // 表示名が存在しない場合、元の名前を表示名に設定
+                    l.PipeTexts.Add(article.Title);
+                }
+            }
+
+            // 見出し([[#関連項目]]とか)を出力
+            if (!String.IsNullOrEmpty(l.Section))
+            {
+                // 見出しは、定型句変換を通す
+                string heading = this.GetHeading(l.Section);
+                b.Append("#");
+                b.Append(heading != null ? heading : l.Section);
+            }
+
+            // 表示名を出力
+            foreach (string text in l.PipeTexts)
+            {
+                b.Append("|");
+                if (!String.IsNullOrEmpty(text))
+                {
+                    // 画像の場合、| の後に内部リンクやテンプレートが書かれている場合があるが、
+                    // 画像は処理対象外でありその中のリンクは個別に再度処理されるため、ここでは特に何もしない
+                    b.Append(text);
+                }
+            }
+
+            // リンクを閉じる
+            b.Append("]]");
+
+            // コメントを付加
+            if (comment != String.Empty)
+            {
+                b.Append(comment);
+            }
+
+            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceInnerLink > " + l.OriginalText);
+            return b.ToString();
+        }
+
+        /// <summary>
+        /// テンプレートの文字列を変換する。
+        /// </summary>
+        /// <param name="link">変換元テンプレート文字列。</param>
+        /// <param name="parent">元記事タイトル。</param>
+        /// <returns>変換済みテンプレート文字列。</returns>
+        protected string ReplaceTemplate(MediaWikiPage.Link link, string parent)
+        {
+            // 変数初期設定
+            MediaWikiPage.Link l = link;
+
+            // テンプレートは記事名が必須
+            if (String.IsNullOrEmpty(l.Title))
+            {
+                System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > 対象外 : " + l.OriginalText);
+                return null;
+            }
+
+            // システム変数の場合は対象外
+            if (this.From.IsMagicWord(l.Title))
+            {
+                System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > システム変数 : " + l.OriginalText);
+                return null;
+            }
+
+            // テンプレート名前空間か、普通の記事かを判定
+            if (!l.IsColon && !l.IsSubpage)
+            {
+                string prefix = null;
+                IList<string> prefixes = this.From.Namespaces[this.From.TemplateNamespace];
+                if (prefixes != null && prefixes.Count > 0)
+                {
+                    prefix = prefixes[0];
+                }
+
+                if (!String.IsNullOrEmpty(prefix) && !l.Title.StartsWith(prefix + ":"))
+                {
+                    // 頭にTemplate:を付けた記事名でアクセスし、テンプレートが存在するかをチェック
+                    string title = prefix + ":" + l.Title;
+                    MediaWikiPage page = null;
+                    try
+                    {
+                        page = this.From.GetPage(title) as MediaWikiPage;
+                    }
+                    catch (WebException e)
+                    {
+                        if (e.Status == WebExceptionStatus.ProtocolError
+                            && (e.Response as HttpWebResponse).StatusCode != HttpStatusCode.NotFound)
+                        {
+                            // 記事が取得できない場合も、404でない場合は存在するとして処理
+                            this.LogLine(String.Format(Resources.LogMessage_TemplateUnknown, l.Title, prefix, e.Message));
+                            l.Title = title;
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.ReplaceTemplate > " + e.Message);
+                    }
+
+                    if (page != null)
+                    {
+                        // 記事が存在する場合、テンプレートをつけた名前を使用
+                        l.Title = title;
+                    }
+                }
+            }
+            else if (l.IsSubpage)
+            {
+                // サブページの場合、記事名を補填
+                l.Title = parent + l.Title;
+            }
+
+            // リンクを辿り、対象記事の言語間リンクを取得
+            string interWiki = this.GetInterWiki(l.Title, true);
+
+            // 記事自体が存在しない(赤リンク)場合、リンクはそのまま
+            StringBuilder b = new StringBuilder();
+            if (interWiki == null)
+            {
+                b.Append(l.OriginalText);
+            }
+            else if (interWiki == String.Empty)
+            {
+                // 言語間リンクが存在しない場合、[[:en:Template:xxx]]みたいな普通のリンクに置換
+                // おまけで、元のテンプレートの状態をコメントでつける
+                b.Append("[[:");
+                b.Append(this.From.Language.Code);
+                b.Append(":");
+                b.Append(l.Title);
+                b.Append("]]<!-- ");
+                b.Append(l.OriginalText);
+                b.Append(" -->");
+            }
+            else
+            {
+                // 言語間リンクが存在する場合、そちらを指すように置換
+                b.Append("{{");
+
+                // 前の文字列を復元
+                if (l.IsColon)
+                {
+                    b.Append(":");
+                }
+
+                if (l.IsMsgnw)
+                {
+                    b.Append(MediaWikiPage.Msgnw);
+                }
+
+                // : より前の部分を削除して出力(: が無いときは-1+1で0から)
+                b.Append(interWiki.Substring(interWiki.IndexOf(':') + 1));
+
+                // 改行を復元
+                if (l.Enter)
+                {
+                    b.Append("\n");
+                }
+
+                // | の後を付加
+                foreach (string text in l.PipeTexts)
+                {
+                    b.Append("|");
+                    if (!String.IsNullOrEmpty(text))
+                    {
+                        // | の後に内部リンクやテンプレートが書かれている場合があるので、再帰的に処理する
+                        b.Append(this.ReplaceText(text, parent));
+                    }
+                }
+
+                // リンクを閉じる
+                b.Append("}}");
+            }
+
+            System.Diagnostics.Debug.WriteLine("MediaWikiTranslator.replaceTemplate > " + l.OriginalText);
+            return b.ToString();
+        }
+
+        /// <summary>
+        /// 指定されたインデックスの位置に存在する見出し(==関連項目==みたいなの)を解析し、可能であれば変換して返す。
+        /// </summary>
+        /// <param name="heading">変換後の見出し。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <returns>見出しの場合、見出し終了位置のインデックスを返す。それ以外は-1。</returns>
+        protected virtual int ChkTitleLine(out string heading, string text, int index)
+        {
+            // 初期化
+            // ※見出しではない、構文がおかしいなどの場合、-1を返す
+            int lastIndex = -1;
+            
+            // 構文を解析して、1行の文字列と、=の個数を取得
+            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・
+            // ※Wikipediaでは <!--test-.=<!--test-.=関連項目<!--test-.==<!--test-. みたいなのでも
+            //   正常に認識するので、できるだけ対応する
+            // ※変換が正常に行われた場合、コメントは削除される
+            bool startFlag = true;
+            int startSignCounter = 0;
+            string nonCommentLine = String.Empty;
+            StringBuilder b = new StringBuilder();
+            for (lastIndex = index; lastIndex < text.Length; lastIndex++)
+            {
+                char c = text[lastIndex];
+
+                // 改行まで
+                if (c == '\n')
+                {
+                    break;
+                }
+
+                // コメントは無視する
+                string comment;
+                int subindex = MediaWikiTranslator.ChkComment(out comment, text, lastIndex);
+                if (subindex != -1)
+                {
+                    b.Append(comment);
+                    lastIndex = subindex;
+                    continue;
+                }
+                else if (startFlag)
+                {
+                    // 先頭部の場合、=の数を数える
+                    if (c == '=')
+                    {
+                        ++startSignCounter;
+                    }
+                    else
+                    {
+                        startFlag = false;
+                    }
+                }
+
+                nonCommentLine += c;
+                b.Append(c);
+            }
+
+            heading = b.ToString();
+
+            // 改行文字、または文章の最後+1になっているはずなので、1文字戻す
+            --lastIndex;
+
+            // = で始まる行ではない場合、処理対象外
+            if (startSignCounter < 1)
+            {
+                heading = String.Empty;
+                return -1;
+            }
+
+            // 終わりの = の数を確認
+            // ※↓の処理だと中身の無い行(====とか)は弾かれてしまうが、どうせ処理できないので許容する
+            int endSignCounter = 0;
+            for (int i = nonCommentLine.Length - 1; i >= startSignCounter; i--)
+            {
+                if (nonCommentLine[i] == '=')
+                {
+                    ++endSignCounter;
+                }
+                else
+                {
+                    break;
+                }
+            }
+
+            // = で終わる行ではない場合、処理対象外
+            if (endSignCounter < 1)
+            {
+                heading = String.Empty;
+                return -1;
+            }
+
+            // 始まりと終わり、=の少ないほうにあわせる(==test===とか用の処理)
+            int signCounter = startSignCounter;
+            if (startSignCounter > endSignCounter)
+            {
+                signCounter = endSignCounter;
+            }
+
+            // 定型句変換
+            string oldText = nonCommentLine.Substring(signCounter, nonCommentLine.Length - (signCounter * 2)).Trim();
+            string newText = this.GetHeading(oldText);
+            if (newText != null)
+            {
+                string sign = "=";
+                for (int i = 1; i < signCounter; i++)
+                {
+                    sign += "=";
+                }
+
+                string newHeading = sign + newText + sign;
+                this.LogLine(ENTER + heading + " " + Resources.RightArrow + " " + newHeading);
+                heading = newHeading;
+            }
+            else
+            {
+                this.LogLine(ENTER + heading);
+            }
+
+            return lastIndex;
+        }
+
+        /// <summary>
+        /// 指定されたコードでの見出しに相当する、別の言語での見出しを取得。
+        /// </summary>
+        /// <param name="heading">翻訳元言語での見出し。</param>
+        /// <returns>翻訳先言語での見出し。値が存在しない場合は<c>null</c>。</returns>
+        protected string GetHeading(string heading)
+        {
+            return this.HeadingTable.GetWord(heading);
+        }
+
+        /// <summary>
+        /// 指定した言語での言語名称を ページ名|略称 の形式で取得。
+        /// </summary>
+        /// <param name="site">サイト。</param>
+        /// <param name="code">言語のコード。</param>
+        /// <returns>ページ名|略称形式の言語名称。</returns>
+        protected string GetFullName(Website site, string code)
+        {
+            if (site.Language.Names.ContainsKey(code))
+            {
+                Language.LanguageName name = site.Language.Names[code];
+                if (!String.IsNullOrEmpty(name.ShortName))
+                {
+                    return name.Name + "|" + name.ShortName;
+                }
+                else
+                {
+                    return name.Name;
+                }
+            }
+
+            return String.Empty;
+        }
+
+        /// <summary>
+        /// 画像などのファイルへの内部リンクの置き換えを行う。
+        /// </summary>
+        /// <param name="link">内部リンク。</param>
+        /// <returns>置き換え後のリンク文字列、置き換えを行わない場合<c>null</c>。</returns>
+        private string ReplaceFileLink(MediaWikiPage.Link link)
+        {
+            // 名前空間だけ翻訳先言語の書式に変換
+            IList<string> names;
+            if (!this.To.Namespaces.TryGetValue(this.To.FileNamespace, out names))
+            {
+                // 翻訳先言語に相当する名前空間が無い場合、何もしない
+                return null;
+            }
+
+            // 記事名の名前空間部分を置き換えて返す
+            link.Title = names[0] + link.Title.Substring(link.Title.IndexOf(':'));
+            return link.Text;
+        }
+
+        #endregion
+    }
+}
index 43d11ec..d1a2a64 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      翻訳支援処理を実装するための共通クラスソース</summary>\r
-//\r
-// <copyright file="Translator.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Logics\r
-{\r
-    using System;\r
-    using System.IO;\r
-    using System.Net;\r
-    using System.Net.NetworkInformation;\r
-    using System.Reflection;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Models;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// 翻訳支援処理を実装するための共通クラスです。\r
-    /// </summary>\r
-    public abstract class Translator\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 改行コード。\r
-        /// </summary>\r
-        public static readonly string ENTER = "\r\n";\r
-\r
-        /// <summary>\r
-        /// ログメッセージ。\r
-        /// </summary>\r
-        private string log;\r
-\r
-        /// <summary>\r
-        /// 変換後テキスト。\r
-        /// </summary>\r
-        private string text;\r
-\r
-        #endregion\r
-        \r
-        #region イベント\r
-\r
-        /// <summary>\r
-        /// ログ更新伝達イベント。\r
-        /// </summary>\r
-        public event EventHandler LogUpdate;\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// 言語間の項目の対訳表。\r
-        /// </summary>\r
-        public TranslationDictionary ItemTable\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語間の見出しの対訳表。\r
-        /// </summary>\r
-        public TranslationTable HeadingTable\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ログメッセージ。\r
-        /// </summary>\r
-        public string Log\r
-        {\r
-            // ※ 将来的には、ロジックでログメッセージを出すなんて形を止めて\r
-            //    データとして保持させてメッセージはビューで・・・としたいが、\r
-            //    手間を考えて当面はこの形のまま実装する。\r
-            get\r
-            {\r
-                return this.log;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                this.log = (value != null) ? value : String.Empty;\r
-                if (this.LogUpdate != null)\r
-                {\r
-                    this.LogUpdate(this, EventArgs.Empty);\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 変換後テキスト。\r
-        /// </summary>\r
-        public string Text\r
-        {\r
-            get\r
-            {\r
-                return this.text;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                this.text = StringUtils.DefaultString(value);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 処理を途中で終了させるためのフラグ。\r
-        /// </summary>\r
-        public bool CancellationPending\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳元言語のサイト。\r
-        /// </summary>\r
-        public Website From\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先言語のサイト。\r
-        /// </summary>\r
-        public Website To\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 静的メソッド\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理のインスタンスを作成。\r
-        /// </summary>\r
-        /// <param name="config">アプリケーション設定。</param>\r
-        /// <param name="from">翻訳元言語。</param>\r
-        /// <param name="to">翻訳先言語。</param>\r
-        /// <returns>生成したインスタンス。</returns>\r
-        /// <remarks>\r
-        /// 設定は設定クラスより取得、無ければ一部自動生成する。\r
-        /// インスタンス生成失敗時は例外を投げる。\r
-        /// </remarks>\r
-        public static Translator Create(Config config, string from, string to)\r
-        {\r
-            // 処理対象に応じてTranslatorを継承したオブジェクトを生成\r
-            ConstructorInfo constructor = config.Translator.GetConstructor(Type.EmptyTypes);\r
-            if (constructor == null)\r
-            {\r
-                throw new NotImplementedException(config.Translator.FullName + " default constructor is not found");\r
-            }\r
-\r
-            // 設定に指定されたクラスを、引数無しのコンストラクタを用いて生成する\r
-            Translator translator = (Translator)constructor.Invoke(null);\r
-\r
-            // Webサイトの設定\r
-            translator.From = config.GetWebsite(from);\r
-            translator.To = config.GetWebsite(to);\r
-\r
-            // 対訳表(項目)の設定\r
-            translator.ItemTable = config.GetItemTableNeedCreate(from, to);\r
-\r
-            // 対訳表(見出し)の設定、使用する言語は決まっているので組み合わせを設定\r
-            translator.HeadingTable = config.HeadingTable;\r
-            translator.HeadingTable.From = from;\r
-            translator.HeadingTable.To = to;\r
-\r
-            return translator;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region publicメソッド\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理実行。\r
-        /// </summary>\r
-        /// <param name="name">記事名。</param>\r
-        /// <returns><c>true</c> 処理成功</returns>\r
-        public virtual bool Run(string name)\r
-        {\r
-            // ※必須な情報が設定されていない場合、InvalidOperationExceptionを返す\r
-            if (this.From == null || this.To == null)\r
-            {\r
-                throw new InvalidOperationException("From or To is null");\r
-            }\r
-\r
-            // 変数を初期化\r
-            this.Initialize();\r
-\r
-            // サーバー接続チェック\r
-            string host = new Uri(this.From.Location).Host;\r
-            if (!String.IsNullOrEmpty(host) && !Settings.Default.IgnoreError)\r
-            {\r
-                if (!this.Ping(host))\r
-                {\r
-                    return false;\r
-                }\r
-            }\r
-\r
-            // 翻訳支援処理実行部の本体を実行\r
-            // ※以降の処理は、継承クラスにて定義\r
-            return this.RunBody(name);\r
-        }\r
-        \r
-        #endregion\r
-\r
-        #region protectedメソッド\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理実行部の本体。\r
-        /// </summary>\r
-        /// <param name="name">記事名。</param>\r
-        /// <returns><c>true</c> 処理成功</returns>\r
-        /// <remarks>テンプレートメソッド的な構造になっています。</remarks>\r
-        protected abstract bool RunBody(string name);\r
-\r
-        /// <summary>\r
-        /// ログメッセージを1行追加出力。\r
-        /// </summary>\r
-        /// <param name="log">ログメッセージ。</param>\r
-        protected void LogLine(string log)\r
-        {\r
-            // 直前のログが改行されていない場合、改行して出力\r
-            if (this.Log != String.Empty && this.Log.EndsWith(ENTER) == false)\r
-            {\r
-                this.Log += ENTER + log + ENTER;\r
-            }\r
-            else\r
-            {\r
-                this.Log += log + ENTER;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ログメッセージを1行追加出力(入力された文字列を書式化して表示)。\r
-        /// </summary>\r
-        /// <param name="format">書式項目を含んだログメッセージ。</param>\r
-        /// <param name="args">書式設定対象オブジェクト配列。</param>\r
-        protected void LogLine(string format, params object[] args)\r
-        {\r
-            // オーバーロードメソッドをコール\r
-            this.LogLine(String.Format(format, args));\r
-        }\r
-\r
-        /// <summary>\r
-        /// ログメッセージを出力しつつページを取得。\r
-        /// </summary>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="notFoundMsg">取得できない場合に出力するメッセージ。</param>\r
-        /// <returns>取得したページ。ページが存在しない場合は <c>null</c> を返す。</returns>\r
-        /// <remarks>通信エラーなど例外が発生した場合は、別途エラーログを出力する。</remarks>\r
-        protected Page GetPage(string title, string notFoundMsg)\r
-        {\r
-            try\r
-            {\r
-                // 取得できた場合はここで終了\r
-                return this.From.GetPage(title);\r
-            }\r
-            catch (WebException e)\r
-            {\r
-                // 通信エラー\r
-                if (e.Status == WebExceptionStatus.ProtocolError\r
-                    && (e.Response as HttpWebResponse).StatusCode == HttpStatusCode.NotFound)\r
-                {\r
-                    // 404\r
-                    this.Log += notFoundMsg;\r
-                }\r
-                else\r
-                {\r
-                    // それ以外のエラー\r
-                    this.LogLine(Resources.RightArrow + " " + e.Message);\r
-                    if (e.Response != null)\r
-                    {\r
-                        this.LogLine(Resources.RightArrow + " " + String.Format(Resources.LogMessage_ErrorURL, e.Response.ResponseUri));\r
-                    }\r
-                }\r
-            }\r
-            catch (FileNotFoundException)\r
-            {\r
-                // ファイル無し\r
-                this.Log += notFoundMsg;\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // その他の想定外のエラー\r
-                this.LogLine(Resources.RightArrow + " " + e.Message);\r
-            }\r
-\r
-            // 取得失敗時いずれの場合もnull\r
-            return null;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region privateメソッド\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理実行時の初期化処理。\r
-        /// </summary>\r
-        private void Initialize()\r
-        {\r
-            // 変数を初期化\r
-            this.log = String.Empty;\r
-            this.Text = String.Empty;\r
-            this.CancellationPending = false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// サーバー接続チェック。\r
-        /// </summary>\r
-        /// <param name="server">サーバー名。</param>\r
-        /// <returns><c>true</c> 接続成功。</returns>\r
-        private bool Ping(string server)\r
-        {\r
-            // サーバー接続チェック\r
-            Ping ping = new Ping();\r
-            try\r
-            {\r
-                PingReply reply = ping.Send(server);\r
-                if (reply.Status != IPStatus.Success)\r
-                {\r
-                    this.LogLine(Resources.ErrorMessageConnectionFailed, reply.Status.ToString());\r
-                    return false;\r
-                }\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                this.LogLine(Resources.ErrorMessageConnectionFailed, e.InnerException.Message);\r
-                return false;\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      翻訳支援処理を実装するための共通クラスソース</summary>
+//
+// <copyright file="Translator.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Logics
+{
+    using System;
+    using System.IO;
+    using System.Net;
+    using System.Net.NetworkInformation;
+    using System.Reflection;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Models;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// 翻訳支援処理を実装するための共通クラスです。
+    /// </summary>
+    public abstract class Translator
+    {
+        #region private変数
+
+        /// <summary>
+        /// 改行コード。
+        /// </summary>
+        public static readonly string ENTER = "\r\n";
+
+        /// <summary>
+        /// ログメッセージ。
+        /// </summary>
+        private string log;
+
+        /// <summary>
+        /// 変換後テキスト。
+        /// </summary>
+        private string text;
+
+        #endregion
+        
+        #region イベント
+
+        /// <summary>
+        /// ログ更新伝達イベント。
+        /// </summary>
+        public event EventHandler LogUpdate;
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// 言語間の項目の対訳表。
+        /// </summary>
+        public TranslationDictionary ItemTable
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 言語間の見出しの対訳表。
+        /// </summary>
+        public TranslationTable HeadingTable
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// ログメッセージ。
+        /// </summary>
+        public string Log
+        {
+            // ※ 将来的には、ロジックでログメッセージを出すなんて形を止めて
+            //    データとして保持させてメッセージはビューで・・・としたいが、
+            //    手間を考えて当面はこの形のまま実装する。
+            get
+            {
+                return this.log;
+            }
+
+            protected set
+            {
+                this.log = (value != null) ? value : String.Empty;
+                if (this.LogUpdate != null)
+                {
+                    this.LogUpdate(this, EventArgs.Empty);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 変換後テキスト。
+        /// </summary>
+        public string Text
+        {
+            get
+            {
+                return this.text;
+            }
+
+            protected set
+            {
+                this.text = StringUtils.DefaultString(value);
+            }
+        }
+
+        /// <summary>
+        /// 処理を途中で終了させるためのフラグ。
+        /// </summary>
+        public bool CancellationPending
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 翻訳元言語のサイト。
+        /// </summary>
+        public Website From
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 翻訳先言語のサイト。
+        /// </summary>
+        public Website To
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region 静的メソッド
+
+        /// <summary>
+        /// 翻訳支援処理のインスタンスを作成。
+        /// </summary>
+        /// <param name="config">アプリケーション設定。</param>
+        /// <param name="from">翻訳元言語。</param>
+        /// <param name="to">翻訳先言語。</param>
+        /// <returns>生成したインスタンス。</returns>
+        /// <remarks>
+        /// 設定は設定クラスより取得、無ければ一部自動生成する。
+        /// インスタンス生成失敗時は例外を投げる。
+        /// </remarks>
+        public static Translator Create(Config config, string from, string to)
+        {
+            // 処理対象に応じてTranslatorを継承したオブジェクトを生成
+            ConstructorInfo constructor = config.Translator.GetConstructor(Type.EmptyTypes);
+            if (constructor == null)
+            {
+                throw new NotImplementedException(config.Translator.FullName + " default constructor is not found");
+            }
+
+            // 設定に指定されたクラスを、引数無しのコンストラクタを用いて生成する
+            Translator translator = (Translator)constructor.Invoke(null);
+
+            // Webサイトの設定
+            translator.From = config.GetWebsite(from);
+            translator.To = config.GetWebsite(to);
+
+            // 対訳表(項目)の設定
+            translator.ItemTable = config.GetItemTableNeedCreate(from, to);
+
+            // 対訳表(見出し)の設定、使用する言語は決まっているので組み合わせを設定
+            translator.HeadingTable = config.HeadingTable;
+            translator.HeadingTable.From = from;
+            translator.HeadingTable.To = to;
+
+            return translator;
+        }
+
+        #endregion
+
+        #region publicメソッド
+
+        /// <summary>
+        /// 翻訳支援処理実行。
+        /// </summary>
+        /// <param name="name">記事名。</param>
+        /// <returns><c>true</c> 処理成功</returns>
+        public virtual bool Run(string name)
+        {
+            // ※必須な情報が設定されていない場合、InvalidOperationExceptionを返す
+            if (this.From == null || this.To == null)
+            {
+                throw new InvalidOperationException("From or To is null");
+            }
+
+            // 変数を初期化
+            this.Initialize();
+
+            // サーバー接続チェック
+            string host = new Uri(this.From.Location).Host;
+            if (!String.IsNullOrEmpty(host) && !Settings.Default.IgnoreError)
+            {
+                if (!this.Ping(host))
+                {
+                    return false;
+                }
+            }
+
+            // 翻訳支援処理実行部の本体を実行
+            // ※以降の処理は、継承クラスにて定義
+            return this.RunBody(name);
+        }
+        
+        #endregion
+
+        #region protectedメソッド
+
+        /// <summary>
+        /// 翻訳支援処理実行部の本体。
+        /// </summary>
+        /// <param name="name">記事名。</param>
+        /// <returns><c>true</c> 処理成功</returns>
+        /// <remarks>テンプレートメソッド的な構造になっています。</remarks>
+        protected abstract bool RunBody(string name);
+
+        /// <summary>
+        /// ログメッセージを1行追加出力。
+        /// </summary>
+        /// <param name="log">ログメッセージ。</param>
+        protected void LogLine(string log)
+        {
+            // 直前のログが改行されていない場合、改行して出力
+            if (this.Log != String.Empty && this.Log.EndsWith(ENTER) == false)
+            {
+                this.Log += ENTER + log + ENTER;
+            }
+            else
+            {
+                this.Log += log + ENTER;
+            }
+        }
+
+        /// <summary>
+        /// ログメッセージを1行追加出力(入力された文字列を書式化して表示)。
+        /// </summary>
+        /// <param name="format">書式項目を含んだログメッセージ。</param>
+        /// <param name="args">書式設定対象オブジェクト配列。</param>
+        protected void LogLine(string format, params object[] args)
+        {
+            // オーバーロードメソッドをコール
+            this.LogLine(String.Format(format, args));
+        }
+
+        /// <summary>
+        /// ログメッセージを出力しつつページを取得。
+        /// </summary>
+        /// <param name="title">ページタイトル。</param>
+        /// <param name="notFoundMsg">取得できない場合に出力するメッセージ。</param>
+        /// <returns>取得したページ。ページが存在しない場合は <c>null</c> を返す。</returns>
+        /// <remarks>通信エラーなど例外が発生した場合は、別途エラーログを出力する。</remarks>
+        protected Page GetPage(string title, string notFoundMsg)
+        {
+            try
+            {
+                // 取得できた場合はここで終了
+                return this.From.GetPage(title);
+            }
+            catch (WebException e)
+            {
+                // 通信エラー
+                if (e.Status == WebExceptionStatus.ProtocolError
+                    && (e.Response as HttpWebResponse).StatusCode == HttpStatusCode.NotFound)
+                {
+                    // 404
+                    this.Log += notFoundMsg;
+                }
+                else
+                {
+                    // それ以外のエラー
+                    this.LogLine(Resources.RightArrow + " " + e.Message);
+                    if (e.Response != null)
+                    {
+                        this.LogLine(Resources.RightArrow + " " + String.Format(Resources.LogMessage_ErrorURL, e.Response.ResponseUri));
+                    }
+                }
+            }
+            catch (FileNotFoundException)
+            {
+                // ファイル無し
+                this.Log += notFoundMsg;
+            }
+            catch (Exception e)
+            {
+                // その他の想定外のエラー
+                this.LogLine(Resources.RightArrow + " " + e.Message);
+            }
+
+            // 取得失敗時いずれの場合もnull
+            return null;
+        }
+
+        #endregion
+
+        #region privateメソッド
+
+        /// <summary>
+        /// 翻訳支援処理実行時の初期化処理。
+        /// </summary>
+        private void Initialize()
+        {
+            // 変数を初期化
+            this.log = String.Empty;
+            this.Text = String.Empty;
+            this.CancellationPending = false;
+        }
+
+        /// <summary>
+        /// サーバー接続チェック。
+        /// </summary>
+        /// <param name="server">サーバー名。</param>
+        /// <returns><c>true</c> 接続成功。</returns>
+        private bool Ping(string server)
+        {
+            // サーバー接続チェック
+            Ping ping = new Ping();
+            try
+            {
+                PingReply reply = ping.Send(server);
+                if (reply.Status != IPStatus.Success)
+                {
+                    this.LogLine(Resources.ErrorMessageConnectionFailed, reply.Status.ToString());
+                    return false;
+                }
+            }
+            catch (Exception e)
+            {
+                this.LogLine(Resources.ErrorMessageConnectionFailed, e.InnerException.Message);
+                return false;
+            }
+
+            return true;
+        }
+
+        #endregion
+    }
+}
index fa3082f..effd1ce 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia翻訳支援ツール主画面デザインソース</summary>\r
-//\r
-// <copyright file="MainForm.Designer.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs\r
-{\r
-    /// <summary>\r
-    /// Wikipedia翻訳支援ツール主画面のクラスです。\r
-    /// </summary>\r
-    public partial class MainForm\r
-    {\r
-        /// <summary>\r
-        /// 必要なデザイナ変数です。\r
-        /// </summary>\r
-        private System.ComponentModel.IContainer components = null;\r
-\r
-        /// <summary>\r
-        /// 使用中のリソースをすべてクリーンアップします。\r
-        /// </summary>\r
-        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>\r
-        protected override void Dispose(bool disposing)\r
-        {\r
-            if (disposing && (components != null))\r
-            {\r
-                components.Dispose();\r
-            }\r
-            base.Dispose(disposing);\r
-        }\r
-\r
-        #region Windows フォーム デザイナで生成されたコード\r
-\r
-        /// <summary>\r
-        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を\r
-        /// コード エディタで変更しないでください。\r
-        /// </summary>\r
-        private void InitializeComponent()\r
-        {\r
-            this.components = new System.ComponentModel.Container();\r
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));\r
-            this.groupBoxTransfer = new System.Windows.Forms.GroupBox();\r
-            this.buttonConfig = new System.Windows.Forms.Button();\r
-            this.labelTarget = new System.Windows.Forms.Label();\r
-            this.comboBoxTarget = new System.Windows.Forms.ComboBox();\r
-            this.labelArrow = new System.Windows.Forms.Label();\r
-            this.linkLabelSourceURL = new System.Windows.Forms.LinkLabel();\r
-            this.labelSource = new System.Windows.Forms.Label();\r
-            this.comboBoxSource = new System.Windows.Forms.ComboBox();\r
-            this.groupBoxSaveDirectory = new System.Windows.Forms.GroupBox();\r
-            this.textBoxSaveDirectory = new System.Windows.Forms.TextBox();\r
-            this.buttonSaveDirectory = new System.Windows.Forms.Button();\r
-            this.groupBoxRun = new System.Windows.Forms.GroupBox();\r
-            this.textBoxLog = new System.Windows.Forms.TextBox();\r
-            this.buttonStop = new System.Windows.Forms.Button();\r
-            this.buttonRun = new System.Windows.Forms.Button();\r
-            this.textBoxArticle = new System.Windows.Forms.TextBox();\r
-            this.labelArticle = new System.Windows.Forms.Label();\r
-            this.folderBrowserDialogSaveDirectory = new System.Windows.Forms.FolderBrowserDialog();\r
-            this.backgroundWorkerRun = new System.ComponentModel.BackgroundWorker();\r
-            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\r
-            this.groupBoxTransfer.SuspendLayout();\r
-            this.groupBoxSaveDirectory.SuspendLayout();\r
-            this.groupBoxRun.SuspendLayout();\r
-            this.SuspendLayout();\r
-            // \r
-            // groupBoxTransfer\r
-            // \r
-            this.groupBoxTransfer.Controls.Add(this.buttonConfig);\r
-            this.groupBoxTransfer.Controls.Add(this.labelTarget);\r
-            this.groupBoxTransfer.Controls.Add(this.comboBoxTarget);\r
-            this.groupBoxTransfer.Controls.Add(this.labelArrow);\r
-            this.groupBoxTransfer.Controls.Add(this.linkLabelSourceURL);\r
-            this.groupBoxTransfer.Controls.Add(this.labelSource);\r
-            this.groupBoxTransfer.Controls.Add(this.comboBoxSource);\r
-            resources.ApplyResources(this.groupBoxTransfer, "groupBoxTransfer");\r
-            this.groupBoxTransfer.Name = "groupBoxTransfer";\r
-            this.groupBoxTransfer.TabStop = false;\r
-            this.toolTip.SetToolTip(this.groupBoxTransfer, resources.GetString("groupBoxTransfer.ToolTip"));\r
-            // \r
-            // buttonConfig\r
-            // \r
-            resources.ApplyResources(this.buttonConfig, "buttonConfig");\r
-            this.buttonConfig.Name = "buttonConfig";\r
-            this.toolTip.SetToolTip(this.buttonConfig, resources.GetString("buttonConfig.ToolTip"));\r
-            this.buttonConfig.UseVisualStyleBackColor = true;\r
-            this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click);\r
-            // \r
-            // labelTarget\r
-            // \r
-            this.labelTarget.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r
-            resources.ApplyResources(this.labelTarget, "labelTarget");\r
-            this.labelTarget.Name = "labelTarget";\r
-            this.toolTip.SetToolTip(this.labelTarget, resources.GetString("labelTarget.ToolTip"));\r
-            // \r
-            // comboBoxTarget\r
-            // \r
-            this.comboBoxTarget.FormattingEnabled = true;\r
-            resources.ApplyResources(this.comboBoxTarget, "comboBoxTarget");\r
-            this.comboBoxTarget.Name = "comboBoxTarget";\r
-            this.comboBoxTarget.Sorted = true;\r
-            this.toolTip.SetToolTip(this.comboBoxTarget, resources.GetString("comboBoxTarget.ToolTip"));\r
-            this.comboBoxTarget.SelectedIndexChanged += new System.EventHandler(this.ComboBoxTarget_SelectedIndexChanged);\r
-            this.comboBoxTarget.Leave += new System.EventHandler(this.ComboBoxTarget_Leave);\r
-            // \r
-            // labelArrow\r
-            // \r
-            resources.ApplyResources(this.labelArrow, "labelArrow");\r
-            this.labelArrow.Name = "labelArrow";\r
-            // \r
-            // linkLabelSourceURL\r
-            // \r
-            this.linkLabelSourceURL.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r
-            resources.ApplyResources(this.linkLabelSourceURL, "linkLabelSourceURL");\r
-            this.linkLabelSourceURL.Name = "linkLabelSourceURL";\r
-            this.linkLabelSourceURL.TabStop = true;\r
-            this.toolTip.SetToolTip(this.linkLabelSourceURL, resources.GetString("linkLabelSourceURL.ToolTip"));\r
-            this.linkLabelSourceURL.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelSourceURL_LinkClicked);\r
-            // \r
-            // labelSource\r
-            // \r
-            this.labelSource.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\r
-            resources.ApplyResources(this.labelSource, "labelSource");\r
-            this.labelSource.Name = "labelSource";\r
-            this.toolTip.SetToolTip(this.labelSource, resources.GetString("labelSource.ToolTip"));\r
-            // \r
-            // comboBoxSource\r
-            // \r
-            this.comboBoxSource.FormattingEnabled = true;\r
-            resources.ApplyResources(this.comboBoxSource, "comboBoxSource");\r
-            this.comboBoxSource.Name = "comboBoxSource";\r
-            this.comboBoxSource.Sorted = true;\r
-            this.toolTip.SetToolTip(this.comboBoxSource, resources.GetString("comboBoxSource.ToolTip"));\r
-            this.comboBoxSource.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSource_SelectedIndexChanged);\r
-            this.comboBoxSource.Leave += new System.EventHandler(this.ComboBoxSource_Leave);\r
-            // \r
-            // groupBoxSaveDirectory\r
-            // \r
-            this.groupBoxSaveDirectory.Controls.Add(this.textBoxSaveDirectory);\r
-            this.groupBoxSaveDirectory.Controls.Add(this.buttonSaveDirectory);\r
-            resources.ApplyResources(this.groupBoxSaveDirectory, "groupBoxSaveDirectory");\r
-            this.groupBoxSaveDirectory.Name = "groupBoxSaveDirectory";\r
-            this.groupBoxSaveDirectory.TabStop = false;\r
-            this.toolTip.SetToolTip(this.groupBoxSaveDirectory, resources.GetString("groupBoxSaveDirectory.ToolTip"));\r
-            // \r
-            // textBoxSaveDirectory\r
-            // \r
-            resources.ApplyResources(this.textBoxSaveDirectory, "textBoxSaveDirectory");\r
-            this.textBoxSaveDirectory.Name = "textBoxSaveDirectory";\r
-            this.toolTip.SetToolTip(this.textBoxSaveDirectory, resources.GetString("textBoxSaveDirectory.ToolTip"));\r
-            this.textBoxSaveDirectory.Leave += new System.EventHandler(this.TextBoxSaveDirectory_Leave);\r
-            // \r
-            // buttonSaveDirectory\r
-            // \r
-            resources.ApplyResources(this.buttonSaveDirectory, "buttonSaveDirectory");\r
-            this.buttonSaveDirectory.Name = "buttonSaveDirectory";\r
-            this.toolTip.SetToolTip(this.buttonSaveDirectory, resources.GetString("buttonSaveDirectory.ToolTip"));\r
-            this.buttonSaveDirectory.UseVisualStyleBackColor = true;\r
-            this.buttonSaveDirectory.Click += new System.EventHandler(this.ButtonSaveDirectory_Click);\r
-            // \r
-            // groupBoxRun\r
-            // \r
-            resources.ApplyResources(this.groupBoxRun, "groupBoxRun");\r
-            this.groupBoxRun.Controls.Add(this.textBoxLog);\r
-            this.groupBoxRun.Controls.Add(this.buttonStop);\r
-            this.groupBoxRun.Controls.Add(this.buttonRun);\r
-            this.groupBoxRun.Controls.Add(this.textBoxArticle);\r
-            this.groupBoxRun.Controls.Add(this.labelArticle);\r
-            this.groupBoxRun.Name = "groupBoxRun";\r
-            this.groupBoxRun.TabStop = false;\r
-            this.toolTip.SetToolTip(this.groupBoxRun, resources.GetString("groupBoxRun.ToolTip"));\r
-            // \r
-            // textBoxLog\r
-            // \r
-            this.textBoxLog.AcceptsReturn = true;\r
-            this.textBoxLog.AcceptsTab = true;\r
-            resources.ApplyResources(this.textBoxLog, "textBoxLog");\r
-            this.textBoxLog.BackColor = System.Drawing.SystemColors.Window;\r
-            this.textBoxLog.Name = "textBoxLog";\r
-            this.textBoxLog.ReadOnly = true;\r
-            this.textBoxLog.TabStop = false;\r
-            // \r
-            // buttonStop\r
-            // \r
-            resources.ApplyResources(this.buttonStop, "buttonStop");\r
-            this.buttonStop.Name = "buttonStop";\r
-            this.toolTip.SetToolTip(this.buttonStop, resources.GetString("buttonStop.ToolTip"));\r
-            this.buttonStop.UseVisualStyleBackColor = true;\r
-            this.buttonStop.Click += new System.EventHandler(this.ButtonStop_Click);\r
-            // \r
-            // buttonRun\r
-            // \r
-            resources.ApplyResources(this.buttonRun, "buttonRun");\r
-            this.buttonRun.Name = "buttonRun";\r
-            this.toolTip.SetToolTip(this.buttonRun, resources.GetString("buttonRun.ToolTip"));\r
-            this.buttonRun.UseVisualStyleBackColor = true;\r
-            this.buttonRun.Click += new System.EventHandler(this.ButtonRun_Click);\r
-            // \r
-            // textBoxArticle\r
-            // \r
-            resources.ApplyResources(this.textBoxArticle, "textBoxArticle");\r
-            this.textBoxArticle.Name = "textBoxArticle";\r
-            this.toolTip.SetToolTip(this.textBoxArticle, resources.GetString("textBoxArticle.ToolTip"));\r
-            // \r
-            // labelArticle\r
-            // \r
-            resources.ApplyResources(this.labelArticle, "labelArticle");\r
-            this.labelArticle.Name = "labelArticle";\r
-            this.toolTip.SetToolTip(this.labelArticle, resources.GetString("labelArticle.ToolTip"));\r
-            // \r
-            // folderBrowserDialogSaveDirectory\r
-            // \r
-            resources.ApplyResources(this.folderBrowserDialogSaveDirectory, "folderBrowserDialogSaveDirectory");\r
-            // \r
-            // backgroundWorkerRun\r
-            // \r
-            this.backgroundWorkerRun.WorkerSupportsCancellation = true;\r
-            this.backgroundWorkerRun.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundWorkerRun_DoWork);\r
-            this.backgroundWorkerRun.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BackgroundWorkerRun_RunWorkerCompleted);\r
-            // \r
-            // toolTip\r
-            // \r
-            this.toolTip.AutoPopDelay = 10000;\r
-            this.toolTip.InitialDelay = 500;\r
-            this.toolTip.ReshowDelay = 100;\r
-            // \r
-            // MainForm\r
-            // \r
-            resources.ApplyResources(this, "$this");\r
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.Controls.Add(this.groupBoxRun);\r
-            this.Controls.Add(this.groupBoxSaveDirectory);\r
-            this.Controls.Add(this.groupBoxTransfer);\r
-            this.Name = "MainForm";\r
-            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);\r
-            this.Load += new System.EventHandler(this.MainForm_Load);\r
-            this.groupBoxTransfer.ResumeLayout(false);\r
-            this.groupBoxTransfer.PerformLayout();\r
-            this.groupBoxSaveDirectory.ResumeLayout(false);\r
-            this.groupBoxSaveDirectory.PerformLayout();\r
-            this.groupBoxRun.ResumeLayout(false);\r
-            this.groupBoxRun.PerformLayout();\r
-            this.ResumeLayout(false);\r
-\r
-        }\r
-\r
-        #endregion\r
-\r
-        private System.Windows.Forms.GroupBox groupBoxTransfer;\r
-        private System.Windows.Forms.GroupBox groupBoxSaveDirectory;\r
-        private System.Windows.Forms.GroupBox groupBoxRun;\r
-        private System.Windows.Forms.ComboBox comboBoxSource;\r
-        private System.Windows.Forms.Label labelSource;\r
-        private System.Windows.Forms.LinkLabel linkLabelSourceURL;\r
-        private System.Windows.Forms.ComboBox comboBoxTarget;\r
-        private System.Windows.Forms.Label labelArrow;\r
-        private System.Windows.Forms.Label labelTarget;\r
-        private System.Windows.Forms.Button buttonConfig;\r
-        private System.Windows.Forms.Button buttonSaveDirectory;\r
-        private System.Windows.Forms.TextBox textBoxSaveDirectory;\r
-        private System.Windows.Forms.Label labelArticle;\r
-        private System.Windows.Forms.TextBox textBoxArticle;\r
-        private System.Windows.Forms.Button buttonRun;\r
-        private System.Windows.Forms.Button buttonStop;\r
-        private System.Windows.Forms.TextBox textBoxLog;\r
-        private System.Windows.Forms.FolderBrowserDialog folderBrowserDialogSaveDirectory;\r
-        private System.ComponentModel.BackgroundWorker backgroundWorkerRun;\r
-        private System.Windows.Forms.ToolTip toolTip;\r
-    }\r
-}\r
-\r
+// ================================================================================================
+// <summary>
+//      Wikipedia翻訳支援ツール主画面デザインソース</summary>
+//
+// <copyright file="MainForm.Designer.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs
+{
+    /// <summary>
+    /// Wikipedia翻訳支援ツール主画面のクラスです。
+    /// </summary>
+    public partial class MainForm
+    {
+        /// <summary>
+        /// 必要なデザイナ変数です。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 使用中のリソースをすべてクリーンアップします。
+        /// </summary>
+        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows フォーム デザイナで生成されたコード
+
+        /// <summary>
+        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
+        /// コード エディタで変更しないでください。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.groupBoxTransfer = new System.Windows.Forms.GroupBox();
+            this.buttonConfig = new System.Windows.Forms.Button();
+            this.labelTarget = new System.Windows.Forms.Label();
+            this.comboBoxTarget = new System.Windows.Forms.ComboBox();
+            this.labelArrow = new System.Windows.Forms.Label();
+            this.linkLabelSourceURL = new System.Windows.Forms.LinkLabel();
+            this.labelSource = new System.Windows.Forms.Label();
+            this.comboBoxSource = new System.Windows.Forms.ComboBox();
+            this.groupBoxSaveDirectory = new System.Windows.Forms.GroupBox();
+            this.textBoxSaveDirectory = new System.Windows.Forms.TextBox();
+            this.buttonSaveDirectory = new System.Windows.Forms.Button();
+            this.groupBoxRun = new System.Windows.Forms.GroupBox();
+            this.textBoxLog = new System.Windows.Forms.TextBox();
+            this.buttonStop = new System.Windows.Forms.Button();
+            this.buttonRun = new System.Windows.Forms.Button();
+            this.textBoxArticle = new System.Windows.Forms.TextBox();
+            this.labelArticle = new System.Windows.Forms.Label();
+            this.folderBrowserDialogSaveDirectory = new System.Windows.Forms.FolderBrowserDialog();
+            this.backgroundWorkerRun = new System.ComponentModel.BackgroundWorker();
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.groupBoxTransfer.SuspendLayout();
+            this.groupBoxSaveDirectory.SuspendLayout();
+            this.groupBoxRun.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // groupBoxTransfer
+            // 
+            this.groupBoxTransfer.Controls.Add(this.buttonConfig);
+            this.groupBoxTransfer.Controls.Add(this.labelTarget);
+            this.groupBoxTransfer.Controls.Add(this.comboBoxTarget);
+            this.groupBoxTransfer.Controls.Add(this.labelArrow);
+            this.groupBoxTransfer.Controls.Add(this.linkLabelSourceURL);
+            this.groupBoxTransfer.Controls.Add(this.labelSource);
+            this.groupBoxTransfer.Controls.Add(this.comboBoxSource);
+            resources.ApplyResources(this.groupBoxTransfer, "groupBoxTransfer");
+            this.groupBoxTransfer.Name = "groupBoxTransfer";
+            this.groupBoxTransfer.TabStop = false;
+            this.toolTip.SetToolTip(this.groupBoxTransfer, resources.GetString("groupBoxTransfer.ToolTip"));
+            // 
+            // buttonConfig
+            // 
+            resources.ApplyResources(this.buttonConfig, "buttonConfig");
+            this.buttonConfig.Name = "buttonConfig";
+            this.toolTip.SetToolTip(this.buttonConfig, resources.GetString("buttonConfig.ToolTip"));
+            this.buttonConfig.UseVisualStyleBackColor = true;
+            this.buttonConfig.Click += new System.EventHandler(this.ButtonConfig_Click);
+            // 
+            // labelTarget
+            // 
+            this.labelTarget.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            resources.ApplyResources(this.labelTarget, "labelTarget");
+            this.labelTarget.Name = "labelTarget";
+            this.toolTip.SetToolTip(this.labelTarget, resources.GetString("labelTarget.ToolTip"));
+            // 
+            // comboBoxTarget
+            // 
+            this.comboBoxTarget.FormattingEnabled = true;
+            resources.ApplyResources(this.comboBoxTarget, "comboBoxTarget");
+            this.comboBoxTarget.Name = "comboBoxTarget";
+            this.comboBoxTarget.Sorted = true;
+            this.toolTip.SetToolTip(this.comboBoxTarget, resources.GetString("comboBoxTarget.ToolTip"));
+            this.comboBoxTarget.SelectedIndexChanged += new System.EventHandler(this.ComboBoxTarget_SelectedIndexChanged);
+            this.comboBoxTarget.Leave += new System.EventHandler(this.ComboBoxTarget_Leave);
+            // 
+            // labelArrow
+            // 
+            resources.ApplyResources(this.labelArrow, "labelArrow");
+            this.labelArrow.Name = "labelArrow";
+            // 
+            // linkLabelSourceURL
+            // 
+            this.linkLabelSourceURL.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            resources.ApplyResources(this.linkLabelSourceURL, "linkLabelSourceURL");
+            this.linkLabelSourceURL.Name = "linkLabelSourceURL";
+            this.linkLabelSourceURL.TabStop = true;
+            this.toolTip.SetToolTip(this.linkLabelSourceURL, resources.GetString("linkLabelSourceURL.ToolTip"));
+            this.linkLabelSourceURL.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelSourceURL_LinkClicked);
+            // 
+            // labelSource
+            // 
+            this.labelSource.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            resources.ApplyResources(this.labelSource, "labelSource");
+            this.labelSource.Name = "labelSource";
+            this.toolTip.SetToolTip(this.labelSource, resources.GetString("labelSource.ToolTip"));
+            // 
+            // comboBoxSource
+            // 
+            this.comboBoxSource.FormattingEnabled = true;
+            resources.ApplyResources(this.comboBoxSource, "comboBoxSource");
+            this.comboBoxSource.Name = "comboBoxSource";
+            this.comboBoxSource.Sorted = true;
+            this.toolTip.SetToolTip(this.comboBoxSource, resources.GetString("comboBoxSource.ToolTip"));
+            this.comboBoxSource.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSource_SelectedIndexChanged);
+            this.comboBoxSource.Leave += new System.EventHandler(this.ComboBoxSource_Leave);
+            // 
+            // groupBoxSaveDirectory
+            // 
+            this.groupBoxSaveDirectory.Controls.Add(this.textBoxSaveDirectory);
+            this.groupBoxSaveDirectory.Controls.Add(this.buttonSaveDirectory);
+            resources.ApplyResources(this.groupBoxSaveDirectory, "groupBoxSaveDirectory");
+            this.groupBoxSaveDirectory.Name = "groupBoxSaveDirectory";
+            this.groupBoxSaveDirectory.TabStop = false;
+            this.toolTip.SetToolTip(this.groupBoxSaveDirectory, resources.GetString("groupBoxSaveDirectory.ToolTip"));
+            // 
+            // textBoxSaveDirectory
+            // 
+            resources.ApplyResources(this.textBoxSaveDirectory, "textBoxSaveDirectory");
+            this.textBoxSaveDirectory.Name = "textBoxSaveDirectory";
+            this.toolTip.SetToolTip(this.textBoxSaveDirectory, resources.GetString("textBoxSaveDirectory.ToolTip"));
+            this.textBoxSaveDirectory.Leave += new System.EventHandler(this.TextBoxSaveDirectory_Leave);
+            // 
+            // buttonSaveDirectory
+            // 
+            resources.ApplyResources(this.buttonSaveDirectory, "buttonSaveDirectory");
+            this.buttonSaveDirectory.Name = "buttonSaveDirectory";
+            this.toolTip.SetToolTip(this.buttonSaveDirectory, resources.GetString("buttonSaveDirectory.ToolTip"));
+            this.buttonSaveDirectory.UseVisualStyleBackColor = true;
+            this.buttonSaveDirectory.Click += new System.EventHandler(this.ButtonSaveDirectory_Click);
+            // 
+            // groupBoxRun
+            // 
+            resources.ApplyResources(this.groupBoxRun, "groupBoxRun");
+            this.groupBoxRun.Controls.Add(this.textBoxLog);
+            this.groupBoxRun.Controls.Add(this.buttonStop);
+            this.groupBoxRun.Controls.Add(this.buttonRun);
+            this.groupBoxRun.Controls.Add(this.textBoxArticle);
+            this.groupBoxRun.Controls.Add(this.labelArticle);
+            this.groupBoxRun.Name = "groupBoxRun";
+            this.groupBoxRun.TabStop = false;
+            this.toolTip.SetToolTip(this.groupBoxRun, resources.GetString("groupBoxRun.ToolTip"));
+            // 
+            // textBoxLog
+            // 
+            this.textBoxLog.AcceptsReturn = true;
+            this.textBoxLog.AcceptsTab = true;
+            resources.ApplyResources(this.textBoxLog, "textBoxLog");
+            this.textBoxLog.BackColor = System.Drawing.SystemColors.Window;
+            this.textBoxLog.Name = "textBoxLog";
+            this.textBoxLog.ReadOnly = true;
+            this.textBoxLog.TabStop = false;
+            // 
+            // buttonStop
+            // 
+            resources.ApplyResources(this.buttonStop, "buttonStop");
+            this.buttonStop.Name = "buttonStop";
+            this.toolTip.SetToolTip(this.buttonStop, resources.GetString("buttonStop.ToolTip"));
+            this.buttonStop.UseVisualStyleBackColor = true;
+            this.buttonStop.Click += new System.EventHandler(this.ButtonStop_Click);
+            // 
+            // buttonRun
+            // 
+            resources.ApplyResources(this.buttonRun, "buttonRun");
+            this.buttonRun.Name = "buttonRun";
+            this.toolTip.SetToolTip(this.buttonRun, resources.GetString("buttonRun.ToolTip"));
+            this.buttonRun.UseVisualStyleBackColor = true;
+            this.buttonRun.Click += new System.EventHandler(this.ButtonRun_Click);
+            // 
+            // textBoxArticle
+            // 
+            resources.ApplyResources(this.textBoxArticle, "textBoxArticle");
+            this.textBoxArticle.Name = "textBoxArticle";
+            this.toolTip.SetToolTip(this.textBoxArticle, resources.GetString("textBoxArticle.ToolTip"));
+            // 
+            // labelArticle
+            // 
+            resources.ApplyResources(this.labelArticle, "labelArticle");
+            this.labelArticle.Name = "labelArticle";
+            this.toolTip.SetToolTip(this.labelArticle, resources.GetString("labelArticle.ToolTip"));
+            // 
+            // folderBrowserDialogSaveDirectory
+            // 
+            resources.ApplyResources(this.folderBrowserDialogSaveDirectory, "folderBrowserDialogSaveDirectory");
+            // 
+            // backgroundWorkerRun
+            // 
+            this.backgroundWorkerRun.WorkerSupportsCancellation = true;
+            this.backgroundWorkerRun.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundWorkerRun_DoWork);
+            this.backgroundWorkerRun.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BackgroundWorkerRun_RunWorkerCompleted);
+            // 
+            // toolTip
+            // 
+            this.toolTip.AutoPopDelay = 10000;
+            this.toolTip.InitialDelay = 500;
+            this.toolTip.ReshowDelay = 100;
+            // 
+            // MainForm
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBoxRun);
+            this.Controls.Add(this.groupBoxSaveDirectory);
+            this.Controls.Add(this.groupBoxTransfer);
+            this.Name = "MainForm";
+            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);
+            this.Load += new System.EventHandler(this.MainForm_Load);
+            this.groupBoxTransfer.ResumeLayout(false);
+            this.groupBoxTransfer.PerformLayout();
+            this.groupBoxSaveDirectory.ResumeLayout(false);
+            this.groupBoxSaveDirectory.PerformLayout();
+            this.groupBoxRun.ResumeLayout(false);
+            this.groupBoxRun.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBoxTransfer;
+        private System.Windows.Forms.GroupBox groupBoxSaveDirectory;
+        private System.Windows.Forms.GroupBox groupBoxRun;
+        private System.Windows.Forms.ComboBox comboBoxSource;
+        private System.Windows.Forms.Label labelSource;
+        private System.Windows.Forms.LinkLabel linkLabelSourceURL;
+        private System.Windows.Forms.ComboBox comboBoxTarget;
+        private System.Windows.Forms.Label labelArrow;
+        private System.Windows.Forms.Label labelTarget;
+        private System.Windows.Forms.Button buttonConfig;
+        private System.Windows.Forms.Button buttonSaveDirectory;
+        private System.Windows.Forms.TextBox textBoxSaveDirectory;
+        private System.Windows.Forms.Label labelArticle;
+        private System.Windows.Forms.TextBox textBoxArticle;
+        private System.Windows.Forms.Button buttonRun;
+        private System.Windows.Forms.Button buttonStop;
+        private System.Windows.Forms.TextBox textBoxLog;
+        private System.Windows.Forms.FolderBrowserDialog folderBrowserDialogSaveDirectory;
+        private System.ComponentModel.BackgroundWorker backgroundWorkerRun;
+        private System.Windows.Forms.ToolTip toolTip;
+    }
+}
+
index 391227c..07c6c2e 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia翻訳支援ツール主画面クラスソース</summary>\r
-//\r
-// <copyright file="MainForm.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.ComponentModel;\r
-    using System.Data;\r
-    using System.Drawing;\r
-    using System.IO;\r
-    using System.Text;\r
-    using System.Windows.Forms;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Logics;\r
-    using Honememo.Wptscs.Models;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// Wikipedia翻訳支援ツール主画面のクラスです。\r
-    /// </summary>\r
-    public partial class MainForm : Form\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 現在読み込んでいるアプリケーションの設定。\r
-        /// </summary>\r
-        private Config config;\r
-\r
-        /// <summary>\r
-        /// 検索支援処理クラスのオブジェクト。\r
-        /// </summary>\r
-        private Translator translate;\r
-\r
-        /// <summary>\r
-        /// 表示済みログ文字列長。\r
-        /// </summary>\r
-        private int logLastLength;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。初期化メソッド呼び出しのみ。\r
-        /// </summary>\r
-        public MainForm()\r
-        {\r
-            // Windows フォーム デザイナで生成されたコード\r
-            this.InitializeComponent();\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 各イベントのメソッド\r
-\r
-        /// <summary>\r
-        /// フォームロード時の処理。初期化。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void MainForm_Load(object sender, EventArgs e)\r
-        {\r
-            // 設定ファイルの読み込み\r
-            if (!this.LoadConfig())\r
-            {\r
-                // 読み込み失敗時はどうしようもないのでそのまま終了\r
-                this.Close();\r
-            }\r
-\r
-            this.translate = null;\r
-            Control.CheckForIllegalCrossThreadCalls = false;\r
-\r
-            // コンボボックス設定\r
-            this.Initialize();\r
-\r
-            // 前回の処理状態を復元\r
-            this.textBoxSaveDirectory.Text = Settings.Default.SaveDirectory;\r
-            this.comboBoxSource.SelectedText = Settings.Default.LastSelectedSource;\r
-            this.comboBoxTarget.SelectedText = Settings.Default.LastSelectedTarget;\r
-\r
-            // コンボボックス変更時の処理をコール\r
-            this.ComboBoxSource_SelectedIndexChanged(sender, e);\r
-            this.ComboBoxTarget_SelectedIndexChanged(sender, e);\r
-        }\r
-\r
-        /// <summary>\r
-        /// フォームクローズ時の処理。処理状態を保存。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)\r
-        {\r
-            // 現在の作業フォルダ、絞込み文字列を保存\r
-            Settings.Default.SaveDirectory = this.textBoxSaveDirectory.Text;\r
-            Settings.Default.LastSelectedSource = this.comboBoxSource.Text;\r
-            Settings.Default.LastSelectedTarget = this.comboBoxTarget.Text;\r
-            Settings.Default.Save();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳元コンボボックス変更時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxSource_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // ラベルに言語名を表示する\r
-            this.labelSource.Text = String.Empty;\r
-            this.linkLabelSourceURL.Text = "http://";\r
-            if (!String.IsNullOrWhiteSpace(this.comboBoxSource.Text))\r
-            {\r
-                this.comboBoxSource.Text = this.comboBoxSource.Text.Trim().ToLower();\r
-\r
-                // その言語の、ユーザーが使用している言語での表示名を表示\r
-                // (日本語環境だったら日本語を、英語だったら英語を)\r
-                Language.LanguageName name;\r
-                this.labelSource.Text = String.Empty;\r
-                if (this.config.GetWebsite(this.comboBoxSource.Text) != null &&\r
-                    this.config.GetWebsite(this.comboBoxSource.Text).Language.Names.TryGetValue(\r
-                    System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName,\r
-                    out name))\r
-                {\r
-                    this.labelSource.Text = name.Name;\r
-                }\r
-\r
-                // サーバーURLの表示\r
-                this.linkLabelSourceURL.Text = this.config.GetWebsite(\r
-                    this.comboBoxSource.Text).Location;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳元コンボボックスフォーカス喪失時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxSource_Leave(object sender, EventArgs e)\r
-        {\r
-            // 直接入力された場合の対策、変更時の処理をコール\r
-            this.ComboBoxSource_SelectedIndexChanged(sender, e);\r
-        }\r
-\r
-        /// <summary>\r
-        /// リンクラベルのリンククリック時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void LinkLabelSourceURL_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
-        {\r
-            // リンクを開く\r
-            System.Diagnostics.Process.Start(((LinkLabel)sender).Text);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先コンボボックス変更時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxTarget_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // ラベルに言語名を表示する\r
-            this.labelTarget.Text = String.Empty;\r
-            if (!String.IsNullOrWhiteSpace(this.comboBoxTarget.Text))\r
-            {\r
-                this.comboBoxTarget.Text = this.comboBoxTarget.Text.Trim().ToLower();\r
-\r
-                // その言語の、ユーザーが使用している言語での表示名を表示\r
-                // (日本語環境だったら日本語を、英語だったら英語を)\r
-                if (this.config.GetWebsite(\r
-                    this.comboBoxTarget.Text) != null)\r
-                {\r
-                    this.labelTarget.Text = this.config.GetWebsite(\r
-                        this.comboBoxTarget.Text).Language.Names[System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName].Name;\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先コンボボックスフォーカス喪失時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ComboBoxTarget_Leave(object sender, EventArgs e)\r
-        {\r
-            // 直接入力された場合の対策、変更時の処理をコール\r
-            this.ComboBoxTarget_SelectedIndexChanged(sender, e);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 設定ボタン押下時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ButtonConfig_Click(object sender, EventArgs e)\r
-        {\r
-            // 設定画面を開く\r
-            ConfigForm form = new ConfigForm(this.config);\r
-            form.ShowDialog();\r
-\r
-            // 戻ってきたら設定ファイルを再読み込み\r
-            // ※ 万が一エラーでもとりあえず続行\r
-            this.LoadConfig();\r
-\r
-            // コンボボックス設定\r
-            string backupSourceSelected = this.comboBoxSource.SelectedText;\r
-            string backupSourceTarget = this.comboBoxTarget.SelectedText;\r
-            this.Initialize();\r
-            this.comboBoxSource.SelectedText = backupSourceSelected;\r
-            this.comboBoxTarget.SelectedText = backupSourceTarget;\r
-\r
-            // コンボボックス変更時の処理をコール\r
-            this.ComboBoxSource_SelectedIndexChanged(sender, e);\r
-            this.ComboBoxTarget_SelectedIndexChanged(sender, e);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 参照ボタン押下時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ButtonSaveDirectory_Click(object sender, EventArgs e)\r
-        {\r
-            // フォルダ名が入力されている場合、それを初期位置に設定\r
-            if (!String.IsNullOrEmpty(this.textBoxSaveDirectory.Text))\r
-            {\r
-                this.folderBrowserDialogSaveDirectory.SelectedPath = this.textBoxSaveDirectory.Text;\r
-            }\r
-\r
-            // フォルダ選択画面をオープン\r
-            if (this.folderBrowserDialogSaveDirectory.ShowDialog() == System.Windows.Forms.DialogResult.OK)\r
-            {\r
-                // フォルダが選択された場合、フォルダ名に選択されたフォルダを設定\r
-                this.textBoxSaveDirectory.Text = this.folderBrowserDialogSaveDirectory.SelectedPath;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 出力先テキストボックスフォーカス喪失時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void TextBoxSaveDirectory_Leave(object sender, EventArgs e)\r
-        {\r
-            // 空白を削除\r
-            this.textBoxSaveDirectory.Text = this.textBoxSaveDirectory.Text.Trim();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 実行ボタン押下時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ButtonRun_Click(object sender, EventArgs e)\r
-        {\r
-            // フォーム入力値をチェック\r
-            if (String.IsNullOrWhiteSpace(this.comboBoxSource.Text))\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageNotSelectedSource);\r
-                this.comboBoxSource.Focus();\r
-                return;\r
-            }\r
-            else if (String.IsNullOrWhiteSpace(this.comboBoxTarget.Text))\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageNotSelectedTarget);\r
-                this.comboBoxTarget.Focus();\r
-                return;\r
-            }\r
-            else if (!String.IsNullOrWhiteSpace(this.comboBoxSource.Text)\r
-                && this.comboBoxSource.Text == this.comboBoxTarget.Text)\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageEqualsSourceAndTarget);\r
-                this.comboBoxTarget.Focus();\r
-                return;\r
-            }\r
-            else if (String.IsNullOrWhiteSpace(this.textBoxSaveDirectory.Text))\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageEmptySaveDirectory);\r
-                this.textBoxSaveDirectory.Focus();\r
-                return;\r
-            }\r
-            else if (!Directory.Exists(this.textBoxSaveDirectory.Text))\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageIgnoreSaveDirectory);\r
-                this.textBoxSaveDirectory.Focus();\r
-                return;\r
-            }\r
-            else if (String.IsNullOrWhiteSpace(this.textBoxArticle.Text))\r
-            {\r
-                FormUtils.WarningDialog(Resources.WarningMessageEmptyArticle);\r
-                this.textBoxArticle.Focus();\r
-                return;\r
-            }\r
-\r
-            // 画面をロック\r
-            this.LockOperation();\r
-\r
-            // バックグラウンド処理を実行\r
-            this.backgroundWorkerRun.RunWorkerAsync();\r
-        }\r
-\r
-        /// <summary>\r
-        /// 中止ボタン押下時の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void ButtonStop_Click(object sender, EventArgs e)\r
-        {\r
-            // 処理を中断\r
-            this.buttonStop.Enabled = false;\r
-            if (this.backgroundWorkerRun.IsBusy == true)\r
-            {\r
-                System.Diagnostics.Debug.WriteLine("MainForm.-Stop_Click > 処理中断");\r
-                this.backgroundWorkerRun.CancelAsync();\r
-                if (this.translate != null)\r
-                {\r
-                    this.translate.CancellationPending = true;\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 実行ボタン バックグラウンド処理(スレッド)。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void BackgroundWorkerRun_DoWork(object sender, DoWorkEventArgs e)\r
-        {\r
-            try\r
-            {\r
-                // 翻訳支援処理の前処理\r
-                this.textBoxLog.Clear();\r
-                this.logLastLength = 0;\r
-                this.textBoxLog.AppendText(\r
-                    String.Format(\r
-                        Resources.LogMessage_Start,\r
-                        FormUtils.ApplicationName(),\r
-                        DateTime.Now.ToString("F")));\r
-\r
-                // 処理結果とログのための出力ファイル名を作成\r
-                string fileName;\r
-                string logName;\r
-                this.MakeFileName(out fileName, out logName, this.textBoxArticle.Text.Trim(), this.textBoxSaveDirectory.Text);\r
-\r
-                // 翻訳支援処理を実行し、結果とログをファイルに出力\r
-                try\r
-                {\r
-                    this.translate = Translator.Create(this.config, this.comboBoxSource.Text, this.comboBoxTarget.Text);\r
-                }\r
-                catch (NotImplementedException)\r
-                {\r
-                    // 将来の拡張用\r
-                    this.textBoxLog.AppendText(String.Format(Resources.InformationMessage_DevelopingMethod, "Wikipedia以外の処理"));\r
-                    FormUtils.InformationDialog(Resources.InformationMessage_DevelopingMethod, "Wikipedia以外の処理");\r
-                    return;\r
-                }\r
-\r
-                this.translate.LogUpdate += new EventHandler(this.GetLogUpdate);\r
-\r
-                // 実行前に、ユーザーから中止要求がされているかをチェック\r
-                if (this.backgroundWorkerRun.CancellationPending)\r
-                {\r
-                    this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));\r
-                }\r
-                else\r
-                {\r
-                    // 翻訳支援処理を実行\r
-                    bool successFlag = this.translate.Run(this.textBoxArticle.Text.Trim());\r
-\r
-                    // 処理に時間がかかるため、出力ファイル名を再確認\r
-                    this.MakeFileName(out fileName, out logName, this.textBoxArticle.Text.Trim(), this.textBoxSaveDirectory.Text);\r
-                    if (successFlag)\r
-                    {\r
-                        // 処理結果を出力\r
-                        try\r
-                        {\r
-                            StreamWriter sw = new StreamWriter(Path.Combine(this.textBoxSaveDirectory.Text, fileName));\r
-                            try\r
-                            {\r
-                                sw.Write(this.translate.Text);\r
-                                this.textBoxLog.AppendText(String.Format(Resources.LogMessage_End, fileName, logName));\r
-                            }\r
-                            finally\r
-                            {\r
-                                sw.Close();\r
-                            }\r
-                        }\r
-                        catch (Exception ex)\r
-                        {\r
-                            this.textBoxLog.AppendText(String.Format(Resources.LogMessage_ErrorFileSave, Path.Combine(this.textBoxSaveDirectory.Text, fileName), ex.Message));\r
-                            this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));\r
-                        }\r
-                    }\r
-                    else\r
-                    {\r
-                        this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));\r
-                    }\r
-                }\r
-\r
-                // ログを出力\r
-                try\r
-                {\r
-                    StreamWriter sw = new StreamWriter(Path.Combine(this.textBoxSaveDirectory.Text, logName));\r
-                    try\r
-                    {\r
-                        sw.Write(this.textBoxLog.Text);\r
-                    }\r
-                    finally\r
-                    {\r
-                        sw.Close();\r
-                    }\r
-                }\r
-                catch (Exception ex)\r
-                {\r
-                    this.textBoxLog.AppendText(String.Format(Resources.LogMessage_ErrorFileSave, Path.Combine(this.textBoxSaveDirectory.Text, logName), ex.Message));\r
-                }\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                this.textBoxLog.AppendText("\r\n" + String.Format(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace) + "\r\n");\r
-                System.Diagnostics.Debug.WriteLine("MainForm.backgroundWorkerRun_DoWork > 想定外のエラー : " + ex.Message);\r
-                System.Diagnostics.Debug.WriteLine(ex.StackTrace);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 実行ボタン バックグラウンド処理(終了時)。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void BackgroundWorkerRun_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)\r
-        {\r
-            // 設定ファイルのキャッシュ情報を更新\r
-            try\r
-            {\r
-                this.config.Save(Settings.Default.ConfigurationFile);\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                FormUtils.WarningDialog(\r
-                    Resources.WarningMessageCacheSaveFailed,\r
-                    ex.Message);\r
-            }\r
-\r
-            // 画面をロック中から解放\r
-            this.Release();\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region それ以外のメソッド\r
-\r
-        /// <summary>\r
-        /// 画面初期化処理。\r
-        /// </summary>\r
-        private void Initialize()\r
-        {\r
-            // コンボボックス設定\r
-            this.comboBoxSource.Items.Clear();\r
-            this.comboBoxTarget.Items.Clear();\r
-\r
-            // 設定ファイルに存在する全言語を選択肢として登録する\r
-            foreach (Website site in this.config.Websites)\r
-            {\r
-                this.comboBoxSource.Items.Add(site.Language.Code);\r
-                this.comboBoxTarget.Items.Add(site.Language.Code);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 設定ファイル読み込み。\r
-        /// </summary>\r
-        /// <returns>読み込み成功時は<c>true</c>。</returns>\r
-        private bool LoadConfig()\r
-        {\r
-            // 設定ファイルの読み込み\r
-            try\r
-            {\r
-                this.config = Config.GetInstance(Settings.Default.ConfigurationFile);\r
-            }\r
-            catch (FileNotFoundException ex)\r
-            {\r
-                // 設定ファイルが見つからない場合\r
-                System.Diagnostics.Debug.WriteLine(\r
-                    "MainForm.LoadConfig > 設定ファイル読み込み失敗 : " + ex.Message);\r
-                FormUtils.ErrorDialog(\r
-                    Resources.ErrorMessageConfigNotFound,\r
-                    Settings.Default.ConfigurationFile);\r
-\r
-                return false;\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                System.Diagnostics.Debug.WriteLine(\r
-                    "MainForm.LoadConfig > 設定ファイル読み込み時エラー : " + ex.StackTrace);\r
-                FormUtils.ErrorDialog(\r
-                    Resources.ErrorMessageConfigLordFailed,\r
-                    ex.Message);\r
-\r
-                return false;\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 画面をロック中に移行。\r
-        /// </summary>\r
-        private void LockOperation()\r
-        {\r
-            // 各種ボタンなどを入力不可に変更\r
-            this.groupBoxTransfer.Enabled = false;\r
-            this.groupBoxSaveDirectory.Enabled = false;\r
-            this.textBoxArticle.Enabled = false;\r
-            this.buttonRun.Enabled = false;\r
-\r
-            // 中止ボタンを有効に変更\r
-            this.buttonStop.Enabled = true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 画面をロック中から解放。\r
-        /// </summary>\r
-        private void Release()\r
-        {\r
-            // 中止ボタンを入力不可に変更\r
-            this.buttonStop.Enabled = false;\r
-\r
-            // 各種ボタンなどを有効に変更\r
-            this.groupBoxTransfer.Enabled = true;\r
-            this.groupBoxSaveDirectory.Enabled = true;\r
-            this.textBoxArticle.Enabled = true;\r
-            this.buttonRun.Enabled = true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡された文字列から.txtと.logの重複していないファイル名を作成。\r
-        /// </summary>\r
-        /// <param name="fileName">出力結果ファイル名。</param>\r
-        /// <param name="logName">出力ログファイル名。</param>\r
-        /// <param name="text">出力する結果テキスト。</param>\r
-        /// <param name="dir">出力先ディレクトリ。</param>\r
-        /// <returns><c>true</c> 出力成功</returns>\r
-        private bool MakeFileName(out string fileName, out string logName, string text, string dir)\r
-        {\r
-            // 出力先フォルダに存在しないファイル名(の拡張子より前)を作成\r
-            // ※渡されたWikipedia等の記事名にファイル名に使えない文字が含まれている場合、_ に置き換える\r
-            //   また、ファイル名が重複している場合、xx[0].txtのように連番を付ける\r
-            string fileNameBase = FormUtils.ReplaceInvalidFileNameChars(text);\r
-            fileName = fileNameBase + ".txt";\r
-            logName = fileNameBase + ".log";\r
-            bool success = false;\r
-            for (int i = 0; i < 100000; i++)\r
-            {\r
-                // ※100000まで試して空きが見つからないことは無いはず、もし見つからなかったら最後のを上書き\r
-                if (!File.Exists(Path.Combine(dir, fileName))\r
-                    && !File.Exists(Path.Combine(dir, logName)))\r
-                {\r
-                    success = true;\r
-                    break;\r
-                }\r
-\r
-                fileName = fileNameBase + "[" + i + "]" + ".txt";\r
-                logName = fileNameBase + "[" + i + "]" + ".log";\r
-            }\r
-\r
-            // 結果設定\r
-            return success;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理クラスのイベント用。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void GetLogUpdate(object sender, System.EventArgs e)\r
-        {\r
-            // 前回以降に追加されたログをテキストボックスに出力\r
-            int length = this.translate.Log.Length;\r
-            if (length > this.logLastLength)\r
-            {\r
-                this.textBoxLog.AppendText(this.translate.Log.Substring(this.logLastLength, length - this.logLastLength));\r
-            }\r
-\r
-            this.logLastLength = length;\r
-        }\r
-\r
-        #endregion\r
-    }\r
+// ================================================================================================
+// <summary>
+//      Wikipedia翻訳支援ツール主画面クラスソース</summary>
+//
+// <copyright file="MainForm.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs
+{
+    using System;
+    using System.Collections.Generic;
+    using System.ComponentModel;
+    using System.Data;
+    using System.Drawing;
+    using System.IO;
+    using System.Text;
+    using System.Windows.Forms;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Logics;
+    using Honememo.Wptscs.Models;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// Wikipedia翻訳支援ツール主画面のクラスです。
+    /// </summary>
+    public partial class MainForm : Form
+    {
+        #region private変数
+
+        /// <summary>
+        /// 現在読み込んでいるアプリケーションの設定。
+        /// </summary>
+        private Config config;
+
+        /// <summary>
+        /// 検索支援処理クラスのオブジェクト。
+        /// </summary>
+        private Translator translate;
+
+        /// <summary>
+        /// 表示済みログ文字列長。
+        /// </summary>
+        private int logLastLength;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ。初期化メソッド呼び出しのみ。
+        /// </summary>
+        public MainForm()
+        {
+            // Windows フォーム デザイナで生成されたコード
+            this.InitializeComponent();
+        }
+
+        #endregion
+
+        #region 各イベントのメソッド
+
+        /// <summary>
+        /// フォームロード時の処理。初期化。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void MainForm_Load(object sender, EventArgs e)
+        {
+            // 設定ファイルの読み込み
+            if (!this.LoadConfig())
+            {
+                // 読み込み失敗時はどうしようもないのでそのまま終了
+                this.Close();
+            }
+
+            this.translate = null;
+            Control.CheckForIllegalCrossThreadCalls = false;
+
+            // コンボボックス設定
+            this.Initialize();
+
+            // 前回の処理状態を復元
+            this.textBoxSaveDirectory.Text = Settings.Default.SaveDirectory;
+            this.comboBoxSource.SelectedText = Settings.Default.LastSelectedSource;
+            this.comboBoxTarget.SelectedText = Settings.Default.LastSelectedTarget;
+
+            // コンボボックス変更時の処理をコール
+            this.ComboBoxSource_SelectedIndexChanged(sender, e);
+            this.ComboBoxTarget_SelectedIndexChanged(sender, e);
+        }
+
+        /// <summary>
+        /// フォームクローズ時の処理。処理状態を保存。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
+        {
+            // 現在の作業フォルダ、絞込み文字列を保存
+            Settings.Default.SaveDirectory = this.textBoxSaveDirectory.Text;
+            Settings.Default.LastSelectedSource = this.comboBoxSource.Text;
+            Settings.Default.LastSelectedTarget = this.comboBoxTarget.Text;
+            Settings.Default.Save();
+        }
+
+        /// <summary>
+        /// 翻訳元コンボボックス変更時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxSource_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            // ラベルに言語名を表示する
+            this.labelSource.Text = String.Empty;
+            this.linkLabelSourceURL.Text = "http://";
+            if (!String.IsNullOrWhiteSpace(this.comboBoxSource.Text))
+            {
+                this.comboBoxSource.Text = this.comboBoxSource.Text.Trim().ToLower();
+
+                // その言語の、ユーザーが使用している言語での表示名を表示
+                // (日本語環境だったら日本語を、英語だったら英語を)
+                Language.LanguageName name;
+                this.labelSource.Text = String.Empty;
+                if (this.config.GetWebsite(this.comboBoxSource.Text) != null &&
+                    this.config.GetWebsite(this.comboBoxSource.Text).Language.Names.TryGetValue(
+                    System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
+                    out name))
+                {
+                    this.labelSource.Text = name.Name;
+                }
+
+                // サーバーURLの表示
+                this.linkLabelSourceURL.Text = this.config.GetWebsite(
+                    this.comboBoxSource.Text).Location;
+            }
+        }
+
+        /// <summary>
+        /// 翻訳元コンボボックスフォーカス喪失時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxSource_Leave(object sender, EventArgs e)
+        {
+            // 直接入力された場合の対策、変更時の処理をコール
+            this.ComboBoxSource_SelectedIndexChanged(sender, e);
+        }
+
+        /// <summary>
+        /// リンクラベルのリンククリック時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void LinkLabelSourceURL_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+        {
+            // リンクを開く
+            System.Diagnostics.Process.Start(((LinkLabel)sender).Text);
+        }
+
+        /// <summary>
+        /// 翻訳先コンボボックス変更時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxTarget_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            // ラベルに言語名を表示する
+            this.labelTarget.Text = String.Empty;
+            if (!String.IsNullOrWhiteSpace(this.comboBoxTarget.Text))
+            {
+                this.comboBoxTarget.Text = this.comboBoxTarget.Text.Trim().ToLower();
+
+                // その言語の、ユーザーが使用している言語での表示名を表示
+                // (日本語環境だったら日本語を、英語だったら英語を)
+                if (this.config.GetWebsite(
+                    this.comboBoxTarget.Text) != null)
+                {
+                    this.labelTarget.Text = this.config.GetWebsite(
+                        this.comboBoxTarget.Text).Language.Names[System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName].Name;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 翻訳先コンボボックスフォーカス喪失時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ComboBoxTarget_Leave(object sender, EventArgs e)
+        {
+            // 直接入力された場合の対策、変更時の処理をコール
+            this.ComboBoxTarget_SelectedIndexChanged(sender, e);
+        }
+
+        /// <summary>
+        /// 設定ボタン押下時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ButtonConfig_Click(object sender, EventArgs e)
+        {
+            // 設定画面を開く
+            ConfigForm form = new ConfigForm(this.config);
+            form.ShowDialog();
+
+            // 戻ってきたら設定ファイルを再読み込み
+            // ※ 万が一エラーでもとりあえず続行
+            this.LoadConfig();
+
+            // コンボボックス設定
+            string backupSourceSelected = this.comboBoxSource.SelectedText;
+            string backupSourceTarget = this.comboBoxTarget.SelectedText;
+            this.Initialize();
+            this.comboBoxSource.SelectedText = backupSourceSelected;
+            this.comboBoxTarget.SelectedText = backupSourceTarget;
+
+            // コンボボックス変更時の処理をコール
+            this.ComboBoxSource_SelectedIndexChanged(sender, e);
+            this.ComboBoxTarget_SelectedIndexChanged(sender, e);
+        }
+
+        /// <summary>
+        /// 参照ボタン押下時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ButtonSaveDirectory_Click(object sender, EventArgs e)
+        {
+            // フォルダ名が入力されている場合、それを初期位置に設定
+            if (!String.IsNullOrEmpty(this.textBoxSaveDirectory.Text))
+            {
+                this.folderBrowserDialogSaveDirectory.SelectedPath = this.textBoxSaveDirectory.Text;
+            }
+
+            // フォルダ選択画面をオープン
+            if (this.folderBrowserDialogSaveDirectory.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                // フォルダが選択された場合、フォルダ名に選択されたフォルダを設定
+                this.textBoxSaveDirectory.Text = this.folderBrowserDialogSaveDirectory.SelectedPath;
+            }
+        }
+
+        /// <summary>
+        /// 出力先テキストボックスフォーカス喪失時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void TextBoxSaveDirectory_Leave(object sender, EventArgs e)
+        {
+            // 空白を削除
+            this.textBoxSaveDirectory.Text = this.textBoxSaveDirectory.Text.Trim();
+        }
+
+        /// <summary>
+        /// 実行ボタン押下時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ButtonRun_Click(object sender, EventArgs e)
+        {
+            // フォーム入力値をチェック
+            if (String.IsNullOrWhiteSpace(this.comboBoxSource.Text))
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageNotSelectedSource);
+                this.comboBoxSource.Focus();
+                return;
+            }
+            else if (String.IsNullOrWhiteSpace(this.comboBoxTarget.Text))
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageNotSelectedTarget);
+                this.comboBoxTarget.Focus();
+                return;
+            }
+            else if (!String.IsNullOrWhiteSpace(this.comboBoxSource.Text)
+                && this.comboBoxSource.Text == this.comboBoxTarget.Text)
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageEqualsSourceAndTarget);
+                this.comboBoxTarget.Focus();
+                return;
+            }
+            else if (String.IsNullOrWhiteSpace(this.textBoxSaveDirectory.Text))
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageEmptySaveDirectory);
+                this.textBoxSaveDirectory.Focus();
+                return;
+            }
+            else if (!Directory.Exists(this.textBoxSaveDirectory.Text))
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageIgnoreSaveDirectory);
+                this.textBoxSaveDirectory.Focus();
+                return;
+            }
+            else if (String.IsNullOrWhiteSpace(this.textBoxArticle.Text))
+            {
+                FormUtils.WarningDialog(Resources.WarningMessageEmptyArticle);
+                this.textBoxArticle.Focus();
+                return;
+            }
+
+            // 画面をロック
+            this.LockOperation();
+
+            // バックグラウンド処理を実行
+            this.backgroundWorkerRun.RunWorkerAsync();
+        }
+
+        /// <summary>
+        /// 中止ボタン押下時の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void ButtonStop_Click(object sender, EventArgs e)
+        {
+            // 処理を中断
+            this.buttonStop.Enabled = false;
+            if (this.backgroundWorkerRun.IsBusy == true)
+            {
+                System.Diagnostics.Debug.WriteLine("MainForm.-Stop_Click > 処理中断");
+                this.backgroundWorkerRun.CancelAsync();
+                if (this.translate != null)
+                {
+                    this.translate.CancellationPending = true;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 実行ボタン バックグラウンド処理(スレッド)。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void BackgroundWorkerRun_DoWork(object sender, DoWorkEventArgs e)
+        {
+            try
+            {
+                // 翻訳支援処理の前処理
+                this.textBoxLog.Clear();
+                this.logLastLength = 0;
+                this.textBoxLog.AppendText(
+                    String.Format(
+                        Resources.LogMessage_Start,
+                        FormUtils.ApplicationName(),
+                        DateTime.Now.ToString("F")));
+
+                // 処理結果とログのための出力ファイル名を作成
+                string fileName;
+                string logName;
+                this.MakeFileName(out fileName, out logName, this.textBoxArticle.Text.Trim(), this.textBoxSaveDirectory.Text);
+
+                // 翻訳支援処理を実行し、結果とログをファイルに出力
+                try
+                {
+                    this.translate = Translator.Create(this.config, this.comboBoxSource.Text, this.comboBoxTarget.Text);
+                }
+                catch (NotImplementedException)
+                {
+                    // 将来の拡張用
+                    this.textBoxLog.AppendText(String.Format(Resources.InformationMessage_DevelopingMethod, "Wikipedia以外の処理"));
+                    FormUtils.InformationDialog(Resources.InformationMessage_DevelopingMethod, "Wikipedia以外の処理");
+                    return;
+                }
+
+                this.translate.LogUpdate += new EventHandler(this.GetLogUpdate);
+
+                // 実行前に、ユーザーから中止要求がされているかをチェック
+                if (this.backgroundWorkerRun.CancellationPending)
+                {
+                    this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));
+                }
+                else
+                {
+                    // 翻訳支援処理を実行
+                    bool successFlag = this.translate.Run(this.textBoxArticle.Text.Trim());
+
+                    // 処理に時間がかかるため、出力ファイル名を再確認
+                    this.MakeFileName(out fileName, out logName, this.textBoxArticle.Text.Trim(), this.textBoxSaveDirectory.Text);
+                    if (successFlag)
+                    {
+                        // 処理結果を出力
+                        try
+                        {
+                            StreamWriter sw = new StreamWriter(Path.Combine(this.textBoxSaveDirectory.Text, fileName));
+                            try
+                            {
+                                sw.Write(this.translate.Text);
+                                this.textBoxLog.AppendText(String.Format(Resources.LogMessage_End, fileName, logName));
+                            }
+                            finally
+                            {
+                                sw.Close();
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            this.textBoxLog.AppendText(String.Format(Resources.LogMessage_ErrorFileSave, Path.Combine(this.textBoxSaveDirectory.Text, fileName), ex.Message));
+                            this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));
+                        }
+                    }
+                    else
+                    {
+                        this.textBoxLog.AppendText(String.Format(Resources.LogMessage_Stop, logName));
+                    }
+                }
+
+                // ログを出力
+                try
+                {
+                    StreamWriter sw = new StreamWriter(Path.Combine(this.textBoxSaveDirectory.Text, logName));
+                    try
+                    {
+                        sw.Write(this.textBoxLog.Text);
+                    }
+                    finally
+                    {
+                        sw.Close();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    this.textBoxLog.AppendText(String.Format(Resources.LogMessage_ErrorFileSave, Path.Combine(this.textBoxSaveDirectory.Text, logName), ex.Message));
+                }
+            }
+            catch (Exception ex)
+            {
+                this.textBoxLog.AppendText("\r\n" + String.Format(Resources.ErrorMessageDevelopmentError, ex.Message, ex.StackTrace) + "\r\n");
+                System.Diagnostics.Debug.WriteLine("MainForm.backgroundWorkerRun_DoWork > 想定外のエラー : " + ex.Message);
+                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
+            }
+        }
+
+        /// <summary>
+        /// 実行ボタン バックグラウンド処理(終了時)。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void BackgroundWorkerRun_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            // 設定ファイルのキャッシュ情報を更新
+            try
+            {
+                this.config.Save(Settings.Default.ConfigurationFile);
+            }
+            catch (Exception ex)
+            {
+                FormUtils.WarningDialog(
+                    Resources.WarningMessageCacheSaveFailed,
+                    ex.Message);
+            }
+
+            // 画面をロック中から解放
+            this.Release();
+        }
+
+        #endregion
+
+        #region それ以外のメソッド
+
+        /// <summary>
+        /// 画面初期化処理。
+        /// </summary>
+        private void Initialize()
+        {
+            // コンボボックス設定
+            this.comboBoxSource.Items.Clear();
+            this.comboBoxTarget.Items.Clear();
+
+            // 設定ファイルに存在する全言語を選択肢として登録する
+            foreach (Website site in this.config.Websites)
+            {
+                this.comboBoxSource.Items.Add(site.Language.Code);
+                this.comboBoxTarget.Items.Add(site.Language.Code);
+            }
+        }
+
+        /// <summary>
+        /// 設定ファイル読み込み。
+        /// </summary>
+        /// <returns>読み込み成功時は<c>true</c>。</returns>
+        private bool LoadConfig()
+        {
+            // 設定ファイルの読み込み
+            try
+            {
+                this.config = Config.GetInstance(Settings.Default.ConfigurationFile);
+            }
+            catch (FileNotFoundException ex)
+            {
+                // 設定ファイルが見つからない場合
+                System.Diagnostics.Debug.WriteLine(
+                    "MainForm.LoadConfig > 設定ファイル読み込み失敗 : " + ex.Message);
+                FormUtils.ErrorDialog(
+                    Resources.ErrorMessageConfigNotFound,
+                    Settings.Default.ConfigurationFile);
+
+                return false;
+            }
+            catch (Exception ex)
+            {
+                System.Diagnostics.Debug.WriteLine(
+                    "MainForm.LoadConfig > 設定ファイル読み込み時エラー : " + ex.StackTrace);
+                FormUtils.ErrorDialog(
+                    Resources.ErrorMessageConfigLordFailed,
+                    ex.Message);
+
+                return false;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// 画面をロック中に移行。
+        /// </summary>
+        private void LockOperation()
+        {
+            // 各種ボタンなどを入力不可に変更
+            this.groupBoxTransfer.Enabled = false;
+            this.groupBoxSaveDirectory.Enabled = false;
+            this.textBoxArticle.Enabled = false;
+            this.buttonRun.Enabled = false;
+
+            // 中止ボタンを有効に変更
+            this.buttonStop.Enabled = true;
+        }
+
+        /// <summary>
+        /// 画面をロック中から解放。
+        /// </summary>
+        private void Release()
+        {
+            // 中止ボタンを入力不可に変更
+            this.buttonStop.Enabled = false;
+
+            // 各種ボタンなどを有効に変更
+            this.groupBoxTransfer.Enabled = true;
+            this.groupBoxSaveDirectory.Enabled = true;
+            this.textBoxArticle.Enabled = true;
+            this.buttonRun.Enabled = true;
+        }
+
+        /// <summary>
+        /// 渡された文字列から.txtと.logの重複していないファイル名を作成。
+        /// </summary>
+        /// <param name="fileName">出力結果ファイル名。</param>
+        /// <param name="logName">出力ログファイル名。</param>
+        /// <param name="text">出力する結果テキスト。</param>
+        /// <param name="dir">出力先ディレクトリ。</param>
+        /// <returns><c>true</c> 出力成功</returns>
+        private bool MakeFileName(out string fileName, out string logName, string text, string dir)
+        {
+            // 出力先フォルダに存在しないファイル名(の拡張子より前)を作成
+            // ※渡されたWikipedia等の記事名にファイル名に使えない文字が含まれている場合、_ に置き換える
+            //   また、ファイル名が重複している場合、xx[0].txtのように連番を付ける
+            string fileNameBase = FormUtils.ReplaceInvalidFileNameChars(text);
+            fileName = fileNameBase + ".txt";
+            logName = fileNameBase + ".log";
+            bool success = false;
+            for (int i = 0; i < 100000; i++)
+            {
+                // ※100000まで試して空きが見つからないことは無いはず、もし見つからなかったら最後のを上書き
+                if (!File.Exists(Path.Combine(dir, fileName))
+                    && !File.Exists(Path.Combine(dir, logName)))
+                {
+                    success = true;
+                    break;
+                }
+
+                fileName = fileNameBase + "[" + i + "]" + ".txt";
+                logName = fileNameBase + "[" + i + "]" + ".log";
+            }
+
+            // 結果設定
+            return success;
+        }
+
+        /// <summary>
+        /// 翻訳支援処理クラスのイベント用。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void GetLogUpdate(object sender, System.EventArgs e)
+        {
+            // 前回以降に追加されたログをテキストボックスに出力
+            int length = this.translate.Log.Length;
+            if (length > this.logLastLength)
+            {
+                this.textBoxLog.AppendText(this.translate.Log.Substring(this.logLastLength, length - this.logLastLength));
+            }
+
+            this.logLastLength = length;
+        }
+
+        #endregion
+    }
 }
\ No newline at end of file
index aa08994..90f94f4 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<root>\r
-  <!-- \r
-    Microsoft ResX Schema \r
-    \r
-    Version 2.0\r
-    \r
-    The primary goals of this format is to allow a simple XML format \r
-    that is mostly human readable. The generation and parsing of the \r
-    various data types are done through the TypeConverter classes \r
-    associated with the data types.\r
-    \r
-    Example:\r
-    \r
-    ... ado.net/XML headers & schema ...\r
-    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
-    <resheader name="version">2.0</resheader>\r
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
-        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
-    </data>\r
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
-        <comment>This is a comment</comment>\r
-    </data>\r
-                \r
-    There are any number of "resheader" rows that contain simple \r
-    name/value pairs.\r
-    \r
-    Each data row contains a name, and value. The row also contains a \r
-    type or mimetype. Type corresponds to a .NET class that support \r
-    text/value conversion through the TypeConverter architecture. \r
-    Classes that don't support this are serialized and stored with the \r
-    mimetype set.\r
-    \r
-    The mimetype is used for serialized objects, and tells the \r
-    ResXResourceReader how to depersist the object. This is currently not \r
-    extensible. For a given mimetype the value must be set accordingly:\r
-    \r
-    Note - application/x-microsoft.net.object.binary.base64 is the format \r
-    that the ResXResourceWriter will generate, however the reader can \r
-    read any of the formats listed below.\r
-    \r
-    mimetype: application/x-microsoft.net.object.binary.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
-            : and then encoded with base64 encoding.\r
-    \r
-    mimetype: application/x-microsoft.net.object.soap.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
-            : and then encoded with base64 encoding.\r
-\r
-    mimetype: application/x-microsoft.net.object.bytearray.base64\r
-    value   : The object must be serialized into a byte array \r
-            : using a System.ComponentModel.TypeConverter\r
-            : and then encoded with base64 encoding.\r
-    -->\r
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
-    <xsd:element name="root" msdata:IsDataSet="true">\r
-      <xsd:complexType>\r
-        <xsd:choice maxOccurs="unbounded">\r
-          <xsd:element name="metadata">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" use="required" type="xsd:string" />\r
-              <xsd:attribute name="type" type="xsd:string" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="assembly">\r
-            <xsd:complexType>\r
-              <xsd:attribute name="alias" type="xsd:string" />\r
-              <xsd:attribute name="name" type="xsd:string" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="data">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="resheader">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-        </xsd:choice>\r
-      </xsd:complexType>\r
-    </xsd:element>\r
-  </xsd:schema>\r
-  <resheader name="resmimetype">\r
-    <value>text/microsoft-resx</value>\r
-  </resheader>\r
-  <resheader name="version">\r
-    <value>2.0</value>\r
-  </resheader>\r
-  <resheader name="reader">\r
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <resheader name="writer">\r
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="buttonConfig.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>193, 61</value>\r
-  </data>\r
-  <data name="buttonConfig.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 23</value>\r
-  </data>\r
-  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
-  <data name="buttonConfig.TabIndex" type="System.Int32, mscorlib">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="buttonConfig.Text" xml:space="preserve">\r
-    <value>設定</value>\r
-  </data>\r
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>464, 17</value>\r
-  </metadata>\r
-  <data name="buttonConfig.ToolTip" xml:space="preserve">\r
-    <value>言語に関する設定を行います。</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonConfig.Name" xml:space="preserve">\r
-    <value>buttonConfig</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonConfig.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonConfig.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonConfig.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelTarget.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>76, 64</value>\r
-  </data>\r
-  <data name="labelTarget.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>101, 21</value>\r
-  </data>\r
-  <data name="labelTarget.TabIndex" type="System.Int32, mscorlib">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="labelTarget.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">\r
-    <value>MiddleLeft</value>\r
-  </data>\r
-  <data name="labelTarget.ToolTip" xml:space="preserve">\r
-    <value>翻訳先の言語です。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTarget.Name" xml:space="preserve">\r
-    <value>labelTarget</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTarget.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTarget.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelTarget.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
-  <data name="comboBoxTarget.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="comboBoxTarget.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>11, 64</value>\r
-  </data>\r
-  <data name="comboBoxTarget.MaxLength" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="comboBoxTarget.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>57, 20</value>\r
-  </data>\r
-  <data name="comboBoxTarget.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="comboBoxTarget.ToolTip" xml:space="preserve">\r
-    <value>翻訳先の言語を選択、または入力します。\r
-入力の場合、Wikipediaで使用されている言語コードを入力してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxTarget.Name" xml:space="preserve">\r
-    <value>comboBoxTarget</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxTarget.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxTarget.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxTarget.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="labelArrow.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelArrow.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>77, 46</value>\r
-  </data>\r
-  <data name="labelArrow.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>17, 12</value>\r
-  </data>\r
-  <data name="labelArrow.TabIndex" type="System.Int32, mscorlib">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="labelArrow.Text" xml:space="preserve">\r
-    <value>↓</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArrow.Name" xml:space="preserve">\r
-    <value>labelArrow</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArrow.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArrow.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArrow.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>193, 21</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>191, 20</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.TabIndex" type="System.Int32, mscorlib">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.Text" xml:space="preserve">\r
-    <value>http://</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">\r
-    <value>MiddleLeft</value>\r
-  </data>\r
-  <data name="linkLabelSourceURL.ToolTip" xml:space="preserve">\r
-    <value>翻訳元WikipediaのURLです。</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelSourceURL.Name" xml:space="preserve">\r
-    <value>linkLabelSourceURL</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelSourceURL.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelSourceURL.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;linkLabelSourceURL.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="labelSource.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>76, 21</value>\r
-  </data>\r
-  <data name="labelSource.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>101, 21</value>\r
-  </data>\r
-  <data name="labelSource.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="labelSource.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">\r
-    <value>MiddleLeft</value>\r
-  </data>\r
-  <data name="labelSource.ToolTip" xml:space="preserve">\r
-    <value>翻訳元の言語です。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelSource.Name" xml:space="preserve">\r
-    <value>labelSource</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelSource.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelSource.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelSource.ZOrder" xml:space="preserve">\r
-    <value>5</value>\r
-  </data>\r
-  <data name="comboBoxSource.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">\r
-    <value>Disable</value>\r
-  </data>\r
-  <data name="comboBoxSource.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>11, 21</value>\r
-  </data>\r
-  <data name="comboBoxSource.MaxLength" type="System.Int32, mscorlib">\r
-    <value>10</value>\r
-  </data>\r
-  <data name="comboBoxSource.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>57, 20</value>\r
-  </data>\r
-  <data name="comboBoxSource.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="comboBoxSource.ToolTip" xml:space="preserve">\r
-    <value>翻訳元の言語を選択、または入力します。\r
-入力の場合、Wikipediaで使用されている言語コードを入力してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxSource.Name" xml:space="preserve">\r
-    <value>comboBoxSource</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxSource.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxSource.Parent" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;comboBoxSource.ZOrder" xml:space="preserve">\r
-    <value>6</value>\r
-  </data>\r
-  <data name="groupBoxTransfer.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 12</value>\r
-  </data>\r
-  <data name="groupBoxTransfer.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>400, 96</value>\r
-  </data>\r
-  <data name="groupBoxTransfer.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="groupBoxTransfer.Text" xml:space="preserve">\r
-    <value>翻訳元→先の言語を設定</value>\r
-  </data>\r
-  <data name="groupBoxTransfer.ToolTip" xml:space="preserve">\r
-    <value>翻訳元・先の言語を選択してください。\r
-コンボボックスに目的の言語コードが存在しない場合は、設定画面で登録を行ってください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxTransfer.Name" xml:space="preserve">\r
-    <value>groupBoxTransfer</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxTransfer.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxTransfer.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxTransfer.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>60, 18</value>\r
-  </data>\r
-  <data name="textBoxSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>256, 19</value>\r
-  </data>\r
-  <data name="textBoxSaveDirectory.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxSaveDirectory.ToolTip" xml:space="preserve">\r
-    <value>出力先フォルダはこちらに直接入力することもできます。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxSaveDirectory.Name" xml:space="preserve">\r
-    <value>textBoxSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxSaveDirectory.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxSaveDirectory.Parent" xml:space="preserve">\r
-    <value>groupBoxSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxSaveDirectory.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="buttonSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>11, 16</value>\r
-  </data>\r
-  <data name="buttonSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 23</value>\r
-  </data>\r
-  <data name="buttonSaveDirectory.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="buttonSaveDirectory.Text" xml:space="preserve">\r
-    <value>参照</value>\r
-  </data>\r
-  <data name="buttonSaveDirectory.ToolTip" xml:space="preserve">\r
-    <value>処理結果を出力するフォルダを選択します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonSaveDirectory.Name" xml:space="preserve">\r
-    <value>buttonSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonSaveDirectory.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonSaveDirectory.Parent" xml:space="preserve">\r
-    <value>groupBoxSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonSaveDirectory.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="groupBoxSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 114</value>\r
-  </data>\r
-  <data name="groupBoxSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>340, 49</value>\r
-  </data>\r
-  <data name="groupBoxSaveDirectory.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="groupBoxSaveDirectory.Text" xml:space="preserve">\r
-    <value>処理結果を出力するフォルダの選択</value>\r
-  </data>\r
-  <data name="groupBoxSaveDirectory.ToolTip" xml:space="preserve">\r
-    <value>処理結果を出力するフォルダを選択してください。\r
-指定されたフォルダに記事テキストとログを出力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxSaveDirectory.Name" xml:space="preserve">\r
-    <value>groupBoxSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxSaveDirectory.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxSaveDirectory.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxSaveDirectory.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="groupBoxRun.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="textBoxLog.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
-    <value>Top, Bottom, Left, Right</value>\r
-  </data>\r
-  <data name="textBoxLog.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 56</value>\r
-  </data>\r
-  <data name="textBoxLog.MaxLength" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="textBoxLog.Multiline" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="textBoxLog.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">\r
-    <value>Vertical</value>\r
-  </data>\r
-  <data name="textBoxLog.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>416, 193</value>\r
-  </data>\r
-  <data name="textBoxLog.TabIndex" type="System.Int32, mscorlib">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLog.Name" xml:space="preserve">\r
-    <value>textBoxLog</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLog.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLog.Parent" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxLog.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="buttonStop.Enabled" type="System.Boolean, mscorlib">\r
-    <value>False</value>\r
-  </data>\r
-  <data name="buttonStop.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>288, 18</value>\r
-  </data>\r
-  <data name="buttonStop.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 23</value>\r
-  </data>\r
-  <data name="buttonStop.TabIndex" type="System.Int32, mscorlib">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="buttonStop.Text" xml:space="preserve">\r
-    <value>中止</value>\r
-  </data>\r
-  <data name="buttonStop.ToolTip" xml:space="preserve">\r
-    <value>処理を中断します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonStop.Name" xml:space="preserve">\r
-    <value>buttonStop</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonStop.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonStop.Parent" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonStop.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="buttonRun.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>230, 18</value>\r
-  </data>\r
-  <data name="buttonRun.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>43, 23</value>\r
-  </data>\r
-  <data name="buttonRun.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="buttonRun.Text" xml:space="preserve">\r
-    <value>実行</value>\r
-  </data>\r
-  <data name="buttonRun.ToolTip" xml:space="preserve">\r
-    <value>記事にアクセスし、翻訳支援処理を行います。\r
-作成した翻訳支援ファイルとログは、出力先フォルダに出力されます。</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonRun.Name" xml:space="preserve">\r
-    <value>buttonRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonRun.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonRun.Parent" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;buttonRun.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="textBoxArticle.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>62, 20</value>\r
-  </data>\r
-  <data name="textBoxArticle.MaxLength" type="System.Int32, mscorlib">\r
-    <value>255</value>\r
-  </data>\r
-  <data name="textBoxArticle.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>140, 19</value>\r
-  </data>\r
-  <data name="textBoxArticle.TabIndex" type="System.Int32, mscorlib">\r
-    <value>1</value>\r
-  </data>\r
-  <data name="textBoxArticle.ToolTip" xml:space="preserve">\r
-    <value>翻訳元Wikipediaでの記事名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxArticle.Name" xml:space="preserve">\r
-    <value>textBoxArticle</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxArticle.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxArticle.Parent" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;textBoxArticle.ZOrder" xml:space="preserve">\r
-    <value>3</value>\r
-  </data>\r
-  <data name="labelArticle.AutoSize" type="System.Boolean, mscorlib">\r
-    <value>True</value>\r
-  </data>\r
-  <data name="labelArticle.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>15, 23</value>\r
-  </data>\r
-  <data name="labelArticle.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>41, 12</value>\r
-  </data>\r
-  <data name="labelArticle.TabIndex" type="System.Int32, mscorlib">\r
-    <value>0</value>\r
-  </data>\r
-  <data name="labelArticle.Text" xml:space="preserve">\r
-    <value>記事名</value>\r
-  </data>\r
-  <data name="labelArticle.ToolTip" xml:space="preserve">\r
-    <value>翻訳元Wikipediaでの記事名を入力します。</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArticle.Name" xml:space="preserve">\r
-    <value>labelArticle</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArticle.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArticle.Parent" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;labelArticle.ZOrder" xml:space="preserve">\r
-    <value>4</value>\r
-  </data>\r
-  <data name="groupBoxRun.Location" type="System.Drawing.Point, System.Drawing">\r
-    <value>12, 169</value>\r
-  </data>\r
-  <data name="groupBoxRun.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>440, 262</value>\r
-  </data>\r
-  <data name="groupBoxRun.TabIndex" type="System.Int32, mscorlib">\r
-    <value>2</value>\r
-  </data>\r
-  <data name="groupBoxRun.Text" xml:space="preserve">\r
-    <value>翻訳する記事を指定して、実行</value>\r
-  </data>\r
-  <data name="groupBoxRun.ToolTip" xml:space="preserve">\r
-    <value>目的の記事の、翻訳元言語のWikipediaでの記事名を入力し、実行ボタンを押してください。</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxRun.Name" xml:space="preserve">\r
-    <value>groupBoxRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxRun.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxRun.Parent" xml:space="preserve">\r
-    <value>$this</value>\r
-  </data>\r
-  <data name="&gt;&gt;groupBoxRun.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
-  </data>\r
-  <metadata name="folderBrowserDialogSaveDirectory.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>17, 17</value>\r
-  </metadata>\r
-  <data name="folderBrowserDialogSaveDirectory.Description" xml:space="preserve">\r
-    <value>処理結果を出力するフォルダを選択してください。</value>\r
-  </data>\r
-  <metadata name="backgroundWorkerRun.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>274, 17</value>\r
-  </metadata>\r
-  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-    <value>True</value>\r
-  </metadata>\r
-  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">\r
-    <value>6, 12</value>\r
-  </data>\r
-  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">\r
-    <value>464, 443</value>\r
-  </data>\r
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        AAABAAIAICAQAAAABADoAgAAJgAAABAQEAAAAAQAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC\r
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\r
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
-        AAC7sAAAAAAAAAAAAAAAAAAAu7sAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAABEAAAAAuwAAu7sLsAAA\r
-        AAAREAAAALsAC7u7u7AAAAAAAREAAAC7AAuwAAuwAREREREREAAAuwALsAALsAERERERERAAALsAALsA\r
-        C7AAAAAAAREAAAC7AAALu7uwAAAAABEQAAAAuwAAsAALsAAAAAARAAAAu7sAALu7u7AAAAAAAAAAALu7\r
-        AAC7u7sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAAAAA\r
-        AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7uwALsAALsAAAAAAAAAC7\r
-        u7uwC7AAC7AAAAAAAAALuwAAsAuwAAuwAAAAAAAAC7AAAAALsAALsAAAAAAAAAu7u7uwC7AAC7AAAAAA\r
-        AAALsAALsAuwAAuwAAAAAAAAC7sAC7ALsAALsAAAAAAAAAC7u7sAC7u7u7AAAAAAAAAAC7uwAAuwu7sA\r
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////\r
-        /////x////8P////z///P88J/x/OAf+PznmAB855gAfPOf+Pz4H/H895/z8PAf//DwP/////////////\r
-        z////8/////////////g55//wGef/49nn/+f55//gGef/55nn/+OZ5//wOAf/+HkP///////////////\r
-        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA\r
-        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3\r
-        d3dERERERERER0////////hHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//\r
-        //////hHT///////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA\r
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==\r
-</value>\r
-  </data>\r
-  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">\r
-    <value>480, 480</value>\r
-  </data>\r
-  <data name="$this.Text" xml:space="preserve">\r
-    <value>Wikipedia 翻訳支援ツール C#</value>\r
-  </data>\r
-  <data name="&gt;&gt;folderBrowserDialogSaveDirectory.Name" xml:space="preserve">\r
-    <value>folderBrowserDialogSaveDirectory</value>\r
-  </data>\r
-  <data name="&gt;&gt;folderBrowserDialogSaveDirectory.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.FolderBrowserDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;backgroundWorkerRun.Name" xml:space="preserve">\r
-    <value>backgroundWorkerRun</value>\r
-  </data>\r
-  <data name="&gt;&gt;backgroundWorkerRun.Type" xml:space="preserve">\r
-    <value>System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;toolTip.Name" xml:space="preserve">\r
-    <value>toolTip</value>\r
-  </data>\r
-  <data name="&gt;&gt;toolTip.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
-  <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
-    <value>MainForm</value>\r
-  </data>\r
-  <data name="&gt;&gt;$this.Type" xml:space="preserve">\r
-    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </data>\r
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="buttonConfig.Location" type="System.Drawing.Point, System.Drawing">
+    <value>193, 61</value>
+  </data>
+  <data name="buttonConfig.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 23</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="buttonConfig.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="buttonConfig.Text" xml:space="preserve">
+    <value>設定</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>464, 17</value>
+  </metadata>
+  <data name="buttonConfig.ToolTip" xml:space="preserve">
+    <value>言語に関する設定を行います。</value>
+  </data>
+  <data name="&gt;&gt;buttonConfig.Name" xml:space="preserve">
+    <value>buttonConfig</value>
+  </data>
+  <data name="&gt;&gt;buttonConfig.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonConfig.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;buttonConfig.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="labelTarget.Location" type="System.Drawing.Point, System.Drawing">
+    <value>76, 64</value>
+  </data>
+  <data name="labelTarget.Size" type="System.Drawing.Size, System.Drawing">
+    <value>101, 21</value>
+  </data>
+  <data name="labelTarget.TabIndex" type="System.Int32, mscorlib">
+    <value>6</value>
+  </data>
+  <data name="labelTarget.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
+    <value>MiddleLeft</value>
+  </data>
+  <data name="labelTarget.ToolTip" xml:space="preserve">
+    <value>翻訳先の言語です。</value>
+  </data>
+  <data name="&gt;&gt;labelTarget.Name" xml:space="preserve">
+    <value>labelTarget</value>
+  </data>
+  <data name="&gt;&gt;labelTarget.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelTarget.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;labelTarget.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="comboBoxTarget.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="comboBoxTarget.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 64</value>
+  </data>
+  <data name="comboBoxTarget.MaxLength" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="comboBoxTarget.Size" type="System.Drawing.Size, System.Drawing">
+    <value>57, 20</value>
+  </data>
+  <data name="comboBoxTarget.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="comboBoxTarget.ToolTip" xml:space="preserve">
+    <value>翻訳先の言語を選択、または入力します。
+入力の場合、Wikipediaで使用されている言語コードを入力してください。</value>
+  </data>
+  <data name="&gt;&gt;comboBoxTarget.Name" xml:space="preserve">
+    <value>comboBoxTarget</value>
+  </data>
+  <data name="&gt;&gt;comboBoxTarget.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;comboBoxTarget.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;comboBoxTarget.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="labelArrow.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelArrow.Location" type="System.Drawing.Point, System.Drawing">
+    <value>77, 46</value>
+  </data>
+  <data name="labelArrow.Size" type="System.Drawing.Size, System.Drawing">
+    <value>17, 12</value>
+  </data>
+  <data name="labelArrow.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="labelArrow.Text" xml:space="preserve">
+    <value>↓</value>
+  </data>
+  <data name="&gt;&gt;labelArrow.Name" xml:space="preserve">
+    <value>labelArrow</value>
+  </data>
+  <data name="&gt;&gt;labelArrow.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelArrow.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;labelArrow.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="linkLabelSourceURL.Location" type="System.Drawing.Point, System.Drawing">
+    <value>193, 21</value>
+  </data>
+  <data name="linkLabelSourceURL.Size" type="System.Drawing.Size, System.Drawing">
+    <value>191, 20</value>
+  </data>
+  <data name="linkLabelSourceURL.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="linkLabelSourceURL.Text" xml:space="preserve">
+    <value>http://</value>
+  </data>
+  <data name="linkLabelSourceURL.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
+    <value>MiddleLeft</value>
+  </data>
+  <data name="linkLabelSourceURL.ToolTip" xml:space="preserve">
+    <value>翻訳元WikipediaのURLです。</value>
+  </data>
+  <data name="&gt;&gt;linkLabelSourceURL.Name" xml:space="preserve">
+    <value>linkLabelSourceURL</value>
+  </data>
+  <data name="&gt;&gt;linkLabelSourceURL.Type" xml:space="preserve">
+    <value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;linkLabelSourceURL.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;linkLabelSourceURL.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="labelSource.Location" type="System.Drawing.Point, System.Drawing">
+    <value>76, 21</value>
+  </data>
+  <data name="labelSource.Size" type="System.Drawing.Size, System.Drawing">
+    <value>101, 21</value>
+  </data>
+  <data name="labelSource.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="labelSource.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
+    <value>MiddleLeft</value>
+  </data>
+  <data name="labelSource.ToolTip" xml:space="preserve">
+    <value>翻訳元の言語です。</value>
+  </data>
+  <data name="&gt;&gt;labelSource.Name" xml:space="preserve">
+    <value>labelSource</value>
+  </data>
+  <data name="&gt;&gt;labelSource.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelSource.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;labelSource.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="comboBoxSource.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>Disable</value>
+  </data>
+  <data name="comboBoxSource.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 21</value>
+  </data>
+  <data name="comboBoxSource.MaxLength" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="comboBoxSource.Size" type="System.Drawing.Size, System.Drawing">
+    <value>57, 20</value>
+  </data>
+  <data name="comboBoxSource.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="comboBoxSource.ToolTip" xml:space="preserve">
+    <value>翻訳元の言語を選択、または入力します。
+入力の場合、Wikipediaで使用されている言語コードを入力してください。</value>
+  </data>
+  <data name="&gt;&gt;comboBoxSource.Name" xml:space="preserve">
+    <value>comboBoxSource</value>
+  </data>
+  <data name="&gt;&gt;comboBoxSource.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;comboBoxSource.Parent" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;comboBoxSource.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="groupBoxTransfer.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 12</value>
+  </data>
+  <data name="groupBoxTransfer.Size" type="System.Drawing.Size, System.Drawing">
+    <value>400, 96</value>
+  </data>
+  <data name="groupBoxTransfer.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="groupBoxTransfer.Text" xml:space="preserve">
+    <value>翻訳元→先の言語を設定</value>
+  </data>
+  <data name="groupBoxTransfer.ToolTip" xml:space="preserve">
+    <value>翻訳元・先の言語を選択してください。
+コンボボックスに目的の言語コードが存在しない場合は、設定画面で登録を行ってください。</value>
+  </data>
+  <data name="&gt;&gt;groupBoxTransfer.Name" xml:space="preserve">
+    <value>groupBoxTransfer</value>
+  </data>
+  <data name="&gt;&gt;groupBoxTransfer.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxTransfer.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;groupBoxTransfer.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="textBoxSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">
+    <value>60, 18</value>
+  </data>
+  <data name="textBoxSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">
+    <value>256, 19</value>
+  </data>
+  <data name="textBoxSaveDirectory.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="textBoxSaveDirectory.ToolTip" xml:space="preserve">
+    <value>出力先フォルダはこちらに直接入力することもできます。</value>
+  </data>
+  <data name="&gt;&gt;textBoxSaveDirectory.Name" xml:space="preserve">
+    <value>textBoxSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;textBoxSaveDirectory.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxSaveDirectory.Parent" xml:space="preserve">
+    <value>groupBoxSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;textBoxSaveDirectory.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="buttonSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">
+    <value>11, 16</value>
+  </data>
+  <data name="buttonSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 23</value>
+  </data>
+  <data name="buttonSaveDirectory.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="buttonSaveDirectory.Text" xml:space="preserve">
+    <value>参照</value>
+  </data>
+  <data name="buttonSaveDirectory.ToolTip" xml:space="preserve">
+    <value>処理結果を出力するフォルダを選択します。</value>
+  </data>
+  <data name="&gt;&gt;buttonSaveDirectory.Name" xml:space="preserve">
+    <value>buttonSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;buttonSaveDirectory.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonSaveDirectory.Parent" xml:space="preserve">
+    <value>groupBoxSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;buttonSaveDirectory.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="groupBoxSaveDirectory.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 114</value>
+  </data>
+  <data name="groupBoxSaveDirectory.Size" type="System.Drawing.Size, System.Drawing">
+    <value>340, 49</value>
+  </data>
+  <data name="groupBoxSaveDirectory.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="groupBoxSaveDirectory.Text" xml:space="preserve">
+    <value>処理結果を出力するフォルダの選択</value>
+  </data>
+  <data name="groupBoxSaveDirectory.ToolTip" xml:space="preserve">
+    <value>処理結果を出力するフォルダを選択してください。
+指定されたフォルダに記事テキストとログを出力します。</value>
+  </data>
+  <data name="&gt;&gt;groupBoxSaveDirectory.Name" xml:space="preserve">
+    <value>groupBoxSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;groupBoxSaveDirectory.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxSaveDirectory.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;groupBoxSaveDirectory.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="groupBoxRun.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="textBoxLog.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="textBoxLog.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 56</value>
+  </data>
+  <data name="textBoxLog.MaxLength" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="textBoxLog.Multiline" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="textBoxLog.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
+    <value>Vertical</value>
+  </data>
+  <data name="textBoxLog.Size" type="System.Drawing.Size, System.Drawing">
+    <value>416, 193</value>
+  </data>
+  <data name="textBoxLog.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;textBoxLog.Name" xml:space="preserve">
+    <value>textBoxLog</value>
+  </data>
+  <data name="&gt;&gt;textBoxLog.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxLog.Parent" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;textBoxLog.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="buttonStop.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="buttonStop.Location" type="System.Drawing.Point, System.Drawing">
+    <value>288, 18</value>
+  </data>
+  <data name="buttonStop.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 23</value>
+  </data>
+  <data name="buttonStop.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="buttonStop.Text" xml:space="preserve">
+    <value>中止</value>
+  </data>
+  <data name="buttonStop.ToolTip" xml:space="preserve">
+    <value>処理を中断します。</value>
+  </data>
+  <data name="&gt;&gt;buttonStop.Name" xml:space="preserve">
+    <value>buttonStop</value>
+  </data>
+  <data name="&gt;&gt;buttonStop.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonStop.Parent" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;buttonStop.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="buttonRun.Location" type="System.Drawing.Point, System.Drawing">
+    <value>230, 18</value>
+  </data>
+  <data name="buttonRun.Size" type="System.Drawing.Size, System.Drawing">
+    <value>43, 23</value>
+  </data>
+  <data name="buttonRun.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="buttonRun.Text" xml:space="preserve">
+    <value>実行</value>
+  </data>
+  <data name="buttonRun.ToolTip" xml:space="preserve">
+    <value>記事にアクセスし、翻訳支援処理を行います。
+作成した翻訳支援ファイルとログは、出力先フォルダに出力されます。</value>
+  </data>
+  <data name="&gt;&gt;buttonRun.Name" xml:space="preserve">
+    <value>buttonRun</value>
+  </data>
+  <data name="&gt;&gt;buttonRun.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;buttonRun.Parent" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;buttonRun.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="textBoxArticle.Location" type="System.Drawing.Point, System.Drawing">
+    <value>62, 20</value>
+  </data>
+  <data name="textBoxArticle.MaxLength" type="System.Int32, mscorlib">
+    <value>255</value>
+  </data>
+  <data name="textBoxArticle.Size" type="System.Drawing.Size, System.Drawing">
+    <value>140, 19</value>
+  </data>
+  <data name="textBoxArticle.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="textBoxArticle.ToolTip" xml:space="preserve">
+    <value>翻訳元Wikipediaでの記事名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;textBoxArticle.Name" xml:space="preserve">
+    <value>textBoxArticle</value>
+  </data>
+  <data name="&gt;&gt;textBoxArticle.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;textBoxArticle.Parent" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;textBoxArticle.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="labelArticle.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="labelArticle.Location" type="System.Drawing.Point, System.Drawing">
+    <value>15, 23</value>
+  </data>
+  <data name="labelArticle.Size" type="System.Drawing.Size, System.Drawing">
+    <value>41, 12</value>
+  </data>
+  <data name="labelArticle.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="labelArticle.Text" xml:space="preserve">
+    <value>記事名</value>
+  </data>
+  <data name="labelArticle.ToolTip" xml:space="preserve">
+    <value>翻訳元Wikipediaでの記事名を入力します。</value>
+  </data>
+  <data name="&gt;&gt;labelArticle.Name" xml:space="preserve">
+    <value>labelArticle</value>
+  </data>
+  <data name="&gt;&gt;labelArticle.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;labelArticle.Parent" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;labelArticle.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="groupBoxRun.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 169</value>
+  </data>
+  <data name="groupBoxRun.Size" type="System.Drawing.Size, System.Drawing">
+    <value>440, 262</value>
+  </data>
+  <data name="groupBoxRun.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="groupBoxRun.Text" xml:space="preserve">
+    <value>翻訳する記事を指定して、実行</value>
+  </data>
+  <data name="groupBoxRun.ToolTip" xml:space="preserve">
+    <value>目的の記事の、翻訳元言語のWikipediaでの記事名を入力し、実行ボタンを押してください。</value>
+  </data>
+  <data name="&gt;&gt;groupBoxRun.Name" xml:space="preserve">
+    <value>groupBoxRun</value>
+  </data>
+  <data name="&gt;&gt;groupBoxRun.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBoxRun.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;groupBoxRun.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="folderBrowserDialogSaveDirectory.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="folderBrowserDialogSaveDirectory.Description" xml:space="preserve">
+    <value>処理結果を出力するフォルダを選択してください。</value>
+  </data>
+  <metadata name="backgroundWorkerRun.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>274, 17</value>
+  </metadata>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 12</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>464, 443</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAABADoAgAAJgAAABAQEAAAAAQAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAC7sAAAAAAAAAAAAAAAAAAAu7sAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAABEAAAAAuwAAu7sLsAAA
+        AAAREAAAALsAC7u7u7AAAAAAAREAAAC7AAuwAAuwAREREREREAAAuwALsAALsAERERERERAAALsAALsA
+        C7AAAAAAAREAAAC7AAALu7uwAAAAABEQAAAAuwAAsAALsAAAAAARAAAAu7sAALu7u7AAAAAAAAAAALu7
+        AAC7u7sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAAAAAAAAAAAAA
+        AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu7uwALsAALsAAAAAAAAAC7
+        u7uwC7AAC7AAAAAAAAALuwAAsAuwAAuwAAAAAAAAC7AAAAALsAALsAAAAAAAAAu7u7uwC7AAC7AAAAAA
+        AAALsAALsAuwAAuwAAAAAAAAC7sAC7ALsAALsAAAAAAAAAC7u7sAC7u7u7AAAAAAAAAAC7uwAAuwu7sA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        /////x////8P////z///P88J/x/OAf+PznmAB855gAfPOf+Pz4H/H895/z8PAf//DwP/////////////
+        z////8/////////////g55//wGef/49nn/+f55//gGef/55nn/+OZ5//wOAf/+HkP///////////////
+        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3
+        d3dERERERERER0////////hHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//
+        //////hHT///////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==
+</value>
+  </data>
+  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
+    <value>480, 480</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>Wikipedia 翻訳支援ツール C#</value>
+  </data>
+  <data name="&gt;&gt;folderBrowserDialogSaveDirectory.Name" xml:space="preserve">
+    <value>folderBrowserDialogSaveDirectory</value>
+  </data>
+  <data name="&gt;&gt;folderBrowserDialogSaveDirectory.Type" xml:space="preserve">
+    <value>System.Windows.Forms.FolderBrowserDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;backgroundWorkerRun.Name" xml:space="preserve">
+    <value>backgroundWorkerRun</value>
+  </data>
+  <data name="&gt;&gt;backgroundWorkerRun.Type" xml:space="preserve">
+    <value>System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;toolTip.Name" xml:space="preserve">
+    <value>toolTip</value>
+  </data>
+  <data name="&gt;&gt;toolTip.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>MainForm</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
 </root>
\ No newline at end of file
index 10a72ac..35ec57a 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      アプリケーションの設定を保持するクラスソース</summary>\r
-//\r
-// <copyright file="Config.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Windows.Forms;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Logics;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// アプリケーションの設定を保持するクラスです。\r
-    /// </summary>\r
-    public class Config : IXmlSerializable\r
-    {\r
-        #region 静的変数\r
-\r
-        /// <summary>\r
-        /// アプリケーション内でのインスタンス保持変数。\r
-        /// </summary>\r
-        private static IDictionary<string, Config> configs = new Dictionary<string, Config>();\r
-\r
-        #endregion\r
-\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 言語に関する情報。\r
-        /// </summary>\r
-        private IList<Language> languages = new List<Language>();\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの情報。\r
-        /// </summary>\r
-        private IList<Website> websites = new List<Website>();\r
-\r
-        /// <summary>\r
-        /// 言語間の項目の対訳表。\r
-        /// </summary>\r
-        private IList<TranslationDictionary> itemTables = new List<TranslationDictionary>();\r
-\r
-        /// <summary>\r
-        /// 言語間の見出しの対訳表。\r
-        /// </summary>\r
-        private TranslationTable headingTable = new TranslationTable();\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        /// <remarks>通常は<see cref="GetInstance(string)"/>を使用する。</remarks>\r
-        protected Config()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// 翻訳支援処理で使用するロジッククラス名。\r
-        /// </summary>\r
-        public Type Translator\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの情報。\r
-        /// </summary>\r
-        /// <remarks>空でもオブジェクトは存在。</remarks>\r
-        public IList<Website> Websites\r
-        {\r
-            get\r
-            {\r
-                return this.websites;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.websites = Validate.NotNull(value, "websites");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語間の項目の対訳表。\r
-        /// </summary>\r
-        /// <remarks>空でもオブジェクトは存在。</remarks>\r
-        public IList<TranslationDictionary> ItemTables\r
-        {\r
-            get\r
-            {\r
-                return this.itemTables;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.itemTables = Validate.NotNull(value, "itemTables");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 言語間の見出しの対訳表。\r
-        /// </summary>\r
-        /// <remarks>空でもオブジェクトは存在。</remarks>\r
-        public TranslationTable HeadingTable\r
-        {\r
-            get\r
-            {\r
-                return this.headingTable;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.headingTable = Validate.NotNull(value, "headingTable");\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 静的メソッド\r
-\r
-        /// <summary>\r
-        /// アプリケーションの設定を取得する。\r
-        /// ユーザーごとの設定ファイルがあればその内容を、\r
-        /// なければアプリケーション標準の設定ファイルの内容を\r
-        /// 読み込んで、インスタンスを作成する。\r
-        /// </summary>\r
-        /// <param name="file">設定ファイル名。</param>\r
-        /// <returns>作成した/既に存在するインスタンス。</returns>\r
-        public static Config GetInstance(string file)\r
-        {\r
-            // シングルトンとするため、処理をロック\r
-            lock (configs)\r
-            {\r
-                // 既に作成済みのインスタンスがあればその値を使用\r
-                // (設定ファイルのタイムスタンプとか確認して再読み込みした方がよい?)\r
-                if (Config.configs.ContainsKey(file))\r
-                {\r
-                    return Config.configs[file];\r
-                }\r
-\r
-                // 無い場合はユーザーごと・または初期設定用の設定ファイルを読み込み\r
-                string path = FormUtils.SearchUserAppData(file, Settings.Default.ConfigurationCompatible);\r
-                if (String.IsNullOrEmpty(path))\r
-                {\r
-                    // どこにも無い場合は例外を投げる\r
-                    // (空でnewしてもよいが、ユーザーが勘違いすると思うので。)\r
-                    throw new FileNotFoundException(file + " is not found");\r
-                }\r
-\r
-                // 設定ファイルを読み込み\r
-                System.Diagnostics.Debug.WriteLine("Config.GetInstance > " + path + " を読み込み");\r
-                using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read))\r
-                {\r
-                    Config.configs[file] = new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;\r
-                }\r
-            }\r
-\r
-            return Config.configs[file];\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region インスタンスメソッド\r
-\r
-        /// <summary>\r
-        /// 設定をユーザーごとの設定ファイルに書き出し。\r
-        /// </summary>\r
-        /// <param name="file">設定ファイル名。</param>\r
-        public void Save(string file)\r
-        {\r
-            // ファイル出力のため、競合しないよう一応ロック\r
-            lock (Config.configs)\r
-            {\r
-                // 最初にディレクトリの有無を確認し作成\r
-                string path = Application.UserAppDataPath;\r
-                if (!Directory.Exists(path))\r
-                {\r
-                    Directory.CreateDirectory(path);\r
-                }\r
-\r
-                // 設定ファイルを出力\r
-                using (Stream stream = new FileStream(\r
-                    Path.Combine(path, file),\r
-                    FileMode.Create))\r
-                {\r
-                    new XmlSerializer(typeof(Config)).Serialize(stream, this);\r
-                }\r
-            }\r
-        }\r
-        \r
-        #endregion\r
-\r
-        #region 設定値取得用インスタンスメソッド\r
-\r
-        /// <summary>\r
-        /// 設定から、現在の処理対象・指定された言語のウェブサイトを取得する。\r
-        /// </summary>\r
-        /// <param name="lang">言語コード。</param>\r
-        /// <returns>ウェブサイトの情報。存在しない場合は<c>null</c>返す。</returns>\r
-        public Website GetWebsite(string lang)\r
-        {\r
-            // 設定が存在すれば取得した値を返す\r
-            foreach (Website s in this.Websites)\r
-            {\r
-                if (s.Language.Code == lang)\r
-                {\r
-                    return s;\r
-                }\r
-            }\r
-\r
-            // 存在しない場合、nullを返す\r
-            // ※ こっちがNeedCreateじゃないのは、何をnewすればいいのか判らないため\r
-            return null;\r
-        }\r
-        \r
-        /// <summary>\r
-        /// 設定から、現在の処理対象・指定された言語の対訳表(項目)を取得する。\r
-        /// </summary>\r
-        /// <param name="from">翻訳元言語。</param>\r
-        /// <param name="to">翻訳先言語。</param>\r
-        /// <returns>対訳表の情報。存在しない場合は新たに作成した対訳表を返す。</returns>\r
-        public TranslationDictionary GetItemTableNeedCreate(string from, string to)\r
-        {\r
-            // オブジェクトに用意されている共通メソッドをコール\r
-            return TranslationDictionary.GetDictionaryNeedCreate(this.ItemTables, from, to);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッド\r
-\r
-        /// <summary>\r
-        /// シリアライズするXMLのスキーマ定義を返す。\r
-        /// </summary>\r
-        /// <returns>XML表現を記述するXmlSchema。</returns>\r
-        public System.Xml.Schema.XmlSchema GetSchema()\r
-        {\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLからオブジェクトを読み込む。\r
-        /// </summary>\r
-        /// <param name="reader">読込元のXmlReader</param>\r
-        public void ReadXml(XmlReader reader)\r
-        {\r
-            XmlDocument xml = new XmlDocument();\r
-            xml.Load(reader);\r
-\r
-            // ルートエレメントを取得\r
-            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-            XmlElement rootElement = xml.DocumentElement;\r
-\r
-            // ロジッククラス\r
-            this.Translator = this.ParseTranslator(rootElement.SelectSingleNode("Translator").InnerText);\r
-\r
-            // Webサイト\r
-            foreach (XmlNode siteNode in rootElement.SelectSingleNode("Websites").ChildNodes)\r
-            {\r
-                // ノードに指定された内容に応じたインスタンスを取得する\r
-                this.Websites.Add(this.ParseWebsite(siteNode, reader.Settings));\r
-            }\r
-\r
-            // 項目の対訳表\r
-            XmlSerializer serializer = new XmlSerializer(typeof(TranslationDictionary), new XmlRootAttribute("ItemTable"));\r
-            foreach (XmlNode itemNode in rootElement.SelectSingleNode("ItemTables").ChildNodes)\r
-            {\r
-                using (XmlReader r = XmlReader.Create(new StringReader(itemNode.OuterXml), reader.Settings))\r
-                {\r
-                    this.ItemTables.Add(serializer.Deserialize(r) as TranslationDictionary);\r
-                }\r
-            }\r
-\r
-            // 見出しの対訳表\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader(rootElement.SelectSingleNode("HeadingTable").OuterXml),\r
-                reader.Settings))\r
-            {\r
-                this.HeadingTable = new XmlSerializer(typeof(TranslationTable), new XmlRootAttribute("HeadingTable"))\r
-                    .Deserialize(r) as TranslationTable;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトをXMLに出力する。\r
-        /// </summary>\r
-        /// <param name="writer">出力先のXmlWriter</param>\r
-        public void WriteXml(XmlWriter writer)\r
-        {\r
-            // ロジッククラス\r
-            string translator = this.Translator.FullName;\r
-            if (translator.StartsWith(typeof(Translator).Namespace))\r
-            {\r
-                // 自前のエンジンの場合、クラス名だけを出力\r
-                translator = this.Translator.Name;\r
-            }\r
-\r
-            writer.WriteElementString("Translator", translator);\r
-\r
-            // 各処理モードのWebサイト\r
-            writer.WriteStartElement("Websites");\r
-            foreach (Website site in this.Websites)\r
-            {\r
-                // 通常はサイトのパッケージ名も含めたフル名を要素名とする\r
-                string siteName = site.GetType().FullName;\r
-                if (siteName.StartsWith(typeof(Website).Namespace))\r
-                {\r
-                    // 自前のサイトの場合、クラス名だけを出力\r
-                    siteName = site.GetType().Name;\r
-                }\r
-\r
-                new XmlSerializer(site.GetType(), new XmlRootAttribute(siteName)).Serialize(writer, site);\r
-            }\r
-\r
-            writer.WriteEndElement();\r
-\r
-            // 項目の対訳表\r
-            XmlSerializer serializer = new XmlSerializer(typeof(TranslationDictionary), new XmlRootAttribute("ItemTable"));\r
-            writer.WriteStartElement("ItemTables");\r
-            foreach (TranslationDictionary trans in this.ItemTables)\r
-            {\r
-                serializer.Serialize(writer, trans);\r
-            }\r
-\r
-            writer.WriteEndElement();\r
-\r
-            // 見出しの対訳表\r
-            new XmlSerializer(this.HeadingTable.GetType(), new XmlRootAttribute("HeadingTable"))\r
-                .Serialize(writer, this.HeadingTable);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたXML値からTranslatorのクラスを取得するる。\r
-        /// </summary>\r
-        /// <param name="name">XMLのクラス名情報。</param>\r
-        /// <returns>Translatorクラス。</returns>\r
-        /// <remarks>クラスは動的に判定する。クラスが存在しない場合などは随時状況に応じた例外を投げる。</remarks>\r
-        private Type ParseTranslator(string name)\r
-        {\r
-            // Translateと同じパッケージに指定された名前のクラスがあるかを探す\r
-            Type type = Type.GetType(typeof(Translator).Namespace + "." + name, false, true);\r
-            if (type == null)\r
-            {\r
-                // 存在しない場合、そのままの名前でクラスを探索、無ければ例外スロー\r
-                type = Type.GetType(name, true, true);\r
-            }\r
-\r
-            return type;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLノードからWebSiteインスタンスをデシリアライズする。\r
-        /// </summary>\r
-        /// <param name="node">WebSiteをシリアライズしたノード。</param>\r
-        /// <param name="setting">XML読み込み時の設定。</param>\r
-        /// <returns>デシリアライズしたインスタンス。</returns>\r
-        /// <remarks>クラスはノード名から動的に判定する。クラスが存在しない場合などは随時状況に応じた例外を投げる。</remarks>\r
-        private Website ParseWebsite(XmlNode node, XmlReaderSettings setting)\r
-        {\r
-            // WebSiteと同じパッケージに指定された名前のクラスがあるかを探す\r
-            Type type = Type.GetType(typeof(Website).Namespace + "." + node.Name, false, true);\r
-            if (type == null)\r
-            {\r
-                // 存在しない場合、そのままの名前でクラスを探索、無ければ例外スロー\r
-                type = Type.GetType(node.Name, true, true);\r
-            }\r
-\r
-            using (XmlReader r = XmlReader.Create(new StringReader(node.OuterXml), setting))\r
-            {\r
-                return new XmlSerializer(type).Deserialize(r) as Website;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      アプリケーションの設定を保持するクラスソース</summary>
+//
+// <copyright file="Config.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Windows.Forms;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Logics;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// アプリケーションの設定を保持するクラスです。
+    /// </summary>
+    public class Config : IXmlSerializable
+    {
+        #region 静的変数
+
+        /// <summary>
+        /// アプリケーション内でのインスタンス保持変数。
+        /// </summary>
+        private static IDictionary<string, Config> configs = new Dictionary<string, Config>();
+
+        #endregion
+
+        #region private変数
+
+        /// <summary>
+        /// 言語に関する情報。
+        /// </summary>
+        private IList<Language> languages = new List<Language>();
+
+        /// <summary>
+        /// ウェブサイトの情報。
+        /// </summary>
+        private IList<Website> websites = new List<Website>();
+
+        /// <summary>
+        /// 言語間の項目の対訳表。
+        /// </summary>
+        private IList<TranslationDictionary> itemTables = new List<TranslationDictionary>();
+
+        /// <summary>
+        /// 言語間の見出しの対訳表。
+        /// </summary>
+        private TranslationTable headingTable = new TranslationTable();
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ。
+        /// </summary>
+        /// <remarks>通常は<see cref="GetInstance(string)"/>を使用する。</remarks>
+        protected Config()
+        {
+        }
+
+        #endregion
+        
+        #region プロパティ
+
+        /// <summary>
+        /// 翻訳支援処理で使用するロジッククラス名。
+        /// </summary>
+        public Type Translator
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// ウェブサイトの情報。
+        /// </summary>
+        /// <remarks>空でもオブジェクトは存在。</remarks>
+        public IList<Website> Websites
+        {
+            get
+            {
+                return this.websites;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.websites = Validate.NotNull(value, "websites");
+            }
+        }
+
+        /// <summary>
+        /// 言語間の項目の対訳表。
+        /// </summary>
+        /// <remarks>空でもオブジェクトは存在。</remarks>
+        public IList<TranslationDictionary> ItemTables
+        {
+            get
+            {
+                return this.itemTables;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.itemTables = Validate.NotNull(value, "itemTables");
+            }
+        }
+
+        /// <summary>
+        /// 言語間の見出しの対訳表。
+        /// </summary>
+        /// <remarks>空でもオブジェクトは存在。</remarks>
+        public TranslationTable HeadingTable
+        {
+            get
+            {
+                return this.headingTable;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.headingTable = Validate.NotNull(value, "headingTable");
+            }
+        }
+
+        #endregion
+
+        #region 静的メソッド
+
+        /// <summary>
+        /// アプリケーションの設定を取得する。
+        /// ユーザーごとの設定ファイルがあればその内容を、
+        /// なければアプリケーション標準の設定ファイルの内容を
+        /// 読み込んで、インスタンスを作成する。
+        /// </summary>
+        /// <param name="file">設定ファイル名。</param>
+        /// <returns>作成した/既に存在するインスタンス。</returns>
+        public static Config GetInstance(string file)
+        {
+            // シングルトンとするため、処理をロック
+            lock (configs)
+            {
+                // 既に作成済みのインスタンスがあればその値を使用
+                // (設定ファイルのタイムスタンプとか確認して再読み込みした方がよい?)
+                if (Config.configs.ContainsKey(file))
+                {
+                    return Config.configs[file];
+                }
+
+                // 無い場合はユーザーごと・または初期設定用の設定ファイルを読み込み
+                string path = FormUtils.SearchUserAppData(file, Settings.Default.ConfigurationCompatible);
+                if (String.IsNullOrEmpty(path))
+                {
+                    // どこにも無い場合は例外を投げる
+                    // (空でnewしてもよいが、ユーザーが勘違いすると思うので。)
+                    throw new FileNotFoundException(file + " is not found");
+                }
+
+                // 設定ファイルを読み込み
+                System.Diagnostics.Debug.WriteLine("Config.GetInstance > " + path + " を読み込み");
+                using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
+                {
+                    Config.configs[file] = new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;
+                }
+            }
+
+            return Config.configs[file];
+        }
+
+        #endregion
+
+        #region インスタンスメソッド
+
+        /// <summary>
+        /// 設定をユーザーごとの設定ファイルに書き出し。
+        /// </summary>
+        /// <param name="file">設定ファイル名。</param>
+        public void Save(string file)
+        {
+            // ファイル出力のため、競合しないよう一応ロック
+            lock (Config.configs)
+            {
+                // 最初にディレクトリの有無を確認し作成
+                string path = Application.UserAppDataPath;
+                if (!Directory.Exists(path))
+                {
+                    Directory.CreateDirectory(path);
+                }
+
+                // 設定ファイルを出力
+                using (Stream stream = new FileStream(
+                    Path.Combine(path, file),
+                    FileMode.Create))
+                {
+                    new XmlSerializer(typeof(Config)).Serialize(stream, this);
+                }
+            }
+        }
+        
+        #endregion
+
+        #region 設定値取得用インスタンスメソッド
+
+        /// <summary>
+        /// 設定から、現在の処理対象・指定された言語のウェブサイトを取得する。
+        /// </summary>
+        /// <param name="lang">言語コード。</param>
+        /// <returns>ウェブサイトの情報。存在しない場合は<c>null</c>返す。</returns>
+        public Website GetWebsite(string lang)
+        {
+            // 設定が存在すれば取得した値を返す
+            foreach (Website s in this.Websites)
+            {
+                if (s.Language.Code == lang)
+                {
+                    return s;
+                }
+            }
+
+            // 存在しない場合、nullを返す
+            // ※ こっちがNeedCreateじゃないのは、何をnewすればいいのか判らないため
+            return null;
+        }
+        
+        /// <summary>
+        /// 設定から、現在の処理対象・指定された言語の対訳表(項目)を取得する。
+        /// </summary>
+        /// <param name="from">翻訳元言語。</param>
+        /// <param name="to">翻訳先言語。</param>
+        /// <returns>対訳表の情報。存在しない場合は新たに作成した対訳表を返す。</returns>
+        public TranslationDictionary GetItemTableNeedCreate(string from, string to)
+        {
+            // オブジェクトに用意されている共通メソッドをコール
+            return TranslationDictionary.GetDictionaryNeedCreate(this.ItemTables, from, to);
+        }
+
+        #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);
+
+            // ルートエレメントを取得
+            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
+            XmlElement rootElement = xml.DocumentElement;
+
+            // ロジッククラス
+            this.Translator = this.ParseTranslator(rootElement.SelectSingleNode("Translator").InnerText);
+
+            // Webサイト
+            foreach (XmlNode siteNode in rootElement.SelectSingleNode("Websites").ChildNodes)
+            {
+                // ノードに指定された内容に応じたインスタンスを取得する
+                this.Websites.Add(this.ParseWebsite(siteNode, reader.Settings));
+            }
+
+            // 項目の対訳表
+            XmlSerializer serializer = new XmlSerializer(typeof(TranslationDictionary), new XmlRootAttribute("ItemTable"));
+            foreach (XmlNode itemNode in rootElement.SelectSingleNode("ItemTables").ChildNodes)
+            {
+                using (XmlReader r = XmlReader.Create(new StringReader(itemNode.OuterXml), reader.Settings))
+                {
+                    this.ItemTables.Add(serializer.Deserialize(r) as TranslationDictionary);
+                }
+            }
+
+            // 見出しの対訳表
+            using (XmlReader r = XmlReader.Create(
+                new StringReader(rootElement.SelectSingleNode("HeadingTable").OuterXml),
+                reader.Settings))
+            {
+                this.HeadingTable = new XmlSerializer(typeof(TranslationTable), new XmlRootAttribute("HeadingTable"))
+                    .Deserialize(r) as TranslationTable;
+            }
+        }
+
+        /// <summary>
+        /// オブジェクトをXMLに出力する。
+        /// </summary>
+        /// <param name="writer">出力先のXmlWriter</param>
+        public void WriteXml(XmlWriter writer)
+        {
+            // ロジッククラス
+            string translator = this.Translator.FullName;
+            if (translator.StartsWith(typeof(Translator).Namespace))
+            {
+                // 自前のエンジンの場合、クラス名だけを出力
+                translator = this.Translator.Name;
+            }
+
+            writer.WriteElementString("Translator", translator);
+
+            // 各処理モードのWebサイト
+            writer.WriteStartElement("Websites");
+            foreach (Website site in this.Websites)
+            {
+                // 通常はサイトのパッケージ名も含めたフル名を要素名とする
+                string siteName = site.GetType().FullName;
+                if (siteName.StartsWith(typeof(Website).Namespace))
+                {
+                    // 自前のサイトの場合、クラス名だけを出力
+                    siteName = site.GetType().Name;
+                }
+
+                new XmlSerializer(site.GetType(), new XmlRootAttribute(siteName)).Serialize(writer, site);
+            }
+
+            writer.WriteEndElement();
+
+            // 項目の対訳表
+            XmlSerializer serializer = new XmlSerializer(typeof(TranslationDictionary), new XmlRootAttribute("ItemTable"));
+            writer.WriteStartElement("ItemTables");
+            foreach (TranslationDictionary trans in this.ItemTables)
+            {
+                serializer.Serialize(writer, trans);
+            }
+
+            writer.WriteEndElement();
+
+            // 見出しの対訳表
+            new XmlSerializer(this.HeadingTable.GetType(), new XmlRootAttribute("HeadingTable"))
+                .Serialize(writer, this.HeadingTable);
+        }
+
+        /// <summary>
+        /// 指定されたXML値からTranslatorのクラスを取得するる。
+        /// </summary>
+        /// <param name="name">XMLのクラス名情報。</param>
+        /// <returns>Translatorクラス。</returns>
+        /// <remarks>クラスは動的に判定する。クラスが存在しない場合などは随時状況に応じた例外を投げる。</remarks>
+        private Type ParseTranslator(string name)
+        {
+            // Translateと同じパッケージに指定された名前のクラスがあるかを探す
+            Type type = Type.GetType(typeof(Translator).Namespace + "." + name, false, true);
+            if (type == null)
+            {
+                // 存在しない場合、そのままの名前でクラスを探索、無ければ例外スロー
+                type = Type.GetType(name, true, true);
+            }
+
+            return type;
+        }
+
+        /// <summary>
+        /// XMLノードからWebSiteインスタンスをデシリアライズする。
+        /// </summary>
+        /// <param name="node">WebSiteをシリアライズしたノード。</param>
+        /// <param name="setting">XML読み込み時の設定。</param>
+        /// <returns>デシリアライズしたインスタンス。</returns>
+        /// <remarks>クラスはノード名から動的に判定する。クラスが存在しない場合などは随時状況に応じた例外を投げる。</remarks>
+        private Website ParseWebsite(XmlNode node, XmlReaderSettings setting)
+        {
+            // WebSiteと同じパッケージに指定された名前のクラスがあるかを探す
+            Type type = Type.GetType(typeof(Website).Namespace + "." + node.Name, false, true);
+            if (type == null)
+            {
+                // 存在しない場合、そのままの名前でクラスを探索、無ければ例外スロー
+                type = Type.GetType(node.Name, true, true);
+            }
+
+            using (XmlReader r = XmlReader.Create(new StringReader(node.OuterXml), setting))
+            {
+                return new XmlSerializer(type).Deserialize(r) as Website;
+            }
+        }
+
+        #endregion
+    }
+}
index 549a619..07cf984 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      大文字小文字を区別しないIDictionary実装のラッパークラスソース</summary>\r
-//\r
-// <copyright file="IgnoreCaseDictionary.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// 大文字小文字を区別しない<c>IDictionary</c>実装のラッパークラスです。\r
-    /// </summary>\r
-    /// <typeparam name="TValue">ディクショナリ内の値の型。</typeparam>\r
-    /// <remarks>\r
-    /// このクラスを使用して登録した値が、大文字小文字を区別しないことを保証する。\r
-    /// (内部的には大文字小文字を区別した値も保持する。\r
-    /// <c>Dictionary</c>プロパティより参照可。)\r
-    /// ただし、既にキー値に大文字小文字が異なるデータを含んでしまっている\r
-    /// <c>IDictionary</c>をラップした場合、動作は保証しない。\r
-    /// </remarks>\r
-    public class IgnoreCaseDictionary<TValue> : IDictionary<string, TValue>\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>実装クラスのインスタンス。\r
-        /// </summary>\r
-        private IDictionary<string, TValue> dictionary;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// 指定された<c>IDictionary</c>インスタンスをラップするインスタンスを生成。\r
-        /// </summary>\r
-        /// <param name="dictionary">ラップされるインスタンス。</param>\r
-        /// <remarks>インスタンスに大文字小文字違いのキー値が格納されている場合、動作は保障しない。</remarks>\r
-        public IgnoreCaseDictionary(IDictionary<string, TValue> dictionary)\r
-        {\r
-            this.Dictionary = dictionary;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 空の<c>Dictionary</c>インスタンスをラップするインスタンスを生成。\r
-        /// </summary>\r
-        public IgnoreCaseDictionary()\r
-            : this(new Dictionary<string, TValue>())\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 独自実装公開プロパティ\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>実装クラスのインスタンス。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// getしたインスタンスへの変更はこのクラスに反映されない。\r
-        /// 必要ならsetで再度インスタンスを読み込ませること。\r
-        /// </remarks>\r
-        public IDictionary<string, TValue> Dictionary\r
-        {\r
-            get\r
-            {\r
-                return this.dictionary;\r
-            }\r
-\r
-            set\r
-            {\r
-                // 必須な情報が設定されていない場合、例外を返す\r
-                this.dictionary = Validate.NotNull(value);\r
-\r
-                // 大文字小文字を無視した検索用キー情報を作成する\r
-                this.KeyMap = new Dictionary<string, string>();\r
-                foreach (string key in this.dictionary.Keys)\r
-                {\r
-                    this.KeyMap[key.ToLower()] = key;\r
-                }\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region ラップするインスタンスを参照するプロパティ\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>Keys</c>プロパティを呼び出す。\r
-        /// </summary>\r
-        public ICollection<string> Keys\r
-        {\r
-            get\r
-            {\r
-                return this.Dictionary.Keys;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>Values</c>プロパティを呼び出す。\r
-        /// </summary>\r
-        public ICollection<TValue> Values\r
-        {\r
-            get\r
-            {\r
-                return this.Dictionary.Values;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>Count</c>プロパティを呼び出す。\r
-        /// </summary>\r
-        public int Count\r
-        {\r
-            get\r
-            {\r
-                return this.Dictionary.Count;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>IsReadOnly</c>プロパティを呼び出す。\r
-        /// </summary>\r
-        public bool IsReadOnly\r
-        {\r
-            get\r
-            {\r
-                return this.Dictionary.IsReadOnly;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部実装用プロパティ\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を無視したキー情報を格納するための<c>IDictionary</c>。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// 小文字変換後のキーと変換前のキーのマップ。\r
-        /// <c>Dictionary</c>プロパティと同期を取る必要がある。\r
-        /// </remarks>\r
-        protected IDictionary<string, string> KeyMap\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 独自実装インデクサー\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Item</c>プロパティを呼び出す。\r
-        /// </summary>\r
-        /// <param name="key">取得または設定する要素のキー。</param>\r
-        /// <returns>指定したキーを持つ要素。</returns>\r
-        public TValue this[string key]\r
-        {\r
-            get\r
-            {\r
-                // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-                // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-                //    またKeyがなければKeyNotFoundExceptionが飛ぶはず\r
-                return this.Dictionary[this.KeyMap[Validate.NotNull(key).ToLower()]];\r
-            }\r
-\r
-            set\r
-            {\r
-                // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-                // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-                //    またKeyがなければKeyNotFoundExceptionが飛ぶはず\r
-                string k = Validate.NotNull(key).ToLower();\r
-                string orgKey;\r
-                if (this.KeyMap.TryGetValue(k, out orgKey))\r
-                {\r
-                    // 大文字小文字が違う可能性があるので、\r
-                    // オリジナルデータは一旦削除して再登録する\r
-                    this.Dictionary.Remove(orgKey);\r
-                }\r
-\r
-                this.KeyMap[k] = key;\r
-                this.Dictionary[key] = value;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 独自実装メソッド\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Add</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <param name="key">追加する要素のキーとして使用するオブジェクト。</param>\r
-        /// <param name="value">追加する要素の値として使用するオブジェクト。</param>\r
-        public void Add(string key, TValue value)\r
-        {\r
-            // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-            // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-            string k = Validate.NotNull(key).ToLower();\r
-            this.KeyMap.Add(k, key);\r
-            this.Dictionary.Add(key, value);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を区別せず、指定したキーの要素が<c>IgnoreCaseDictionary</c>に格納されているかどうかを確認します。\r
-        /// </summary>\r
-        /// <param name="key"><c>IgnoreCaseDictionary</c>内で検索されるキー。</param>\r
-        /// <returns>指定したキーを持つ要素を<c>IgnoreCaseDictionary</c>が保持している場合は<c>true</c>。それ以外の場合は<c>false</c>。</returns>\r
-        public bool ContainsKey(string key)\r
-        {\r
-            // 同期が取れていることを前提に、キーマップのみ確認する\r
-            // (ラップインスタンスまで見ると、他の例外が起こりえて面倒なため)\r
-            // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-            return this.KeyMap.ContainsKey(Validate.NotNull(key).ToLower());\r
-        }\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Remove</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <param name="key">削除する要素のキー。</param>\r
-        /// <returns>\r
-        /// 要素が正常に削除された場合は<c>true</c>。それ以外の場合は<c>false</c>。\r
-        /// このメソッドは、<c>key</c>が元の<c>IDictionary</c>に見つからなかった場合にも<c>false</c>を返します。\r
-        /// </returns>\r
-        public bool Remove(string key)\r
-        {\r
-            // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-            // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-            string k = Validate.NotNull(key).ToLower();\r
-            string orgKey;\r
-            bool removed = false;\r
-            if (this.KeyMap.TryGetValue(k, out orgKey))\r
-            {\r
-                removed = this.Dictionary.Remove(orgKey);\r
-            }\r
-\r
-            // どちらかが削除できていれば削除成功と返す\r
-            return this.KeyMap.Remove(k) || removed;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>TryGetValue</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <param name="key">値を取得する対象のキー。</param>\r
-        /// <param name="value">\r
-        /// このメソッドが返されるときに、キーが見つかった場合は、指定したキーに関連付けられている値。\r
-        /// それ以外の場合は<c>value</c>パラメーターの型に対する既定の値。このパラメーターは初期化せずに渡されます。</param>\r
-        /// <returns>\r
-        /// 指定したキーを持つ要素が<c>IDictionary</c>を実装するオブジェクトに格納されている場合は<c>true</c>。\r
-        /// それ以外の場合は<c>false</c>。\r
-        /// </returns>\r
-        public bool TryGetValue(string key, out TValue value)\r
-        {\r
-            // 返り値をそのクラスのデフォルト値で初期化\r
-            value = default(TValue);\r
-\r
-            // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-            // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-            string k = Validate.NotNull(key).ToLower();\r
-            string orgKey;\r
-            if (this.KeyMap.TryGetValue(k, out orgKey))\r
-            {\r
-                return this.Dictionary.TryGetValue(orgKey, out value);\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// キーの大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Add</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <param name="item"><c>ICollection</c>に追加するオブジェクト。</param>\r
-        public void Add(KeyValuePair<string, TValue> item)\r
-        {\r
-            // 小文字に変換し、マップを経てラップインスタンスにアクセス\r
-            // ※ nullの場合は事前にArgumentNullExceptionを投げる\r
-            string k = Validate.NotNull(item.Key).ToLower();\r
-            this.KeyMap.Add(k, item.Key);\r
-            this.Dictionary.Add(item);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>Clear</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        public void Clear()\r
-        {\r
-            this.KeyMap.Clear();\r
-            this.Dictionary.Clear();\r
-        }\r
-\r
-        /// <summary>\r
-        /// キーの大文字小文字を区別せず、<c>ICollection</c>に特定のキーと値が格納されているかどうかを判断します。\r
-        /// </summary>\r
-        /// <param name="item"><c>ICollection</c>内で検索される<c>KeyValuePair</c>構造体。</param>\r
-        /// <returns><c>KeyValuePair</c>が<c>ICollection</c>に存在する場合は<c>true</c>。それ以外の場合は<c>false</c>。</returns>\r
-        public bool Contains(KeyValuePair<string, TValue> item)\r
-        {\r
-            // 大文字小文字を区別しないキーと、値で判定する\r
-            if (item.Key == null)\r
-            {\r
-                // キー情報がnullの場合、このクラスでは検知できないのでNG\r
-                return false;\r
-            }\r
-\r
-            TValue value;\r
-            if (this.TryGetValue(item.Key, out value))\r
-            {\r
-                // キーから辿った値が一致していればOK\r
-                return ObjectUtils.Equals(item.Value, value);\r
-            }\r
-\r
-            // どこにも該当しなければ不一致なのでNG\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// <c>ICollection</c>の要素をArrayにコピーします。Arrayの特定のインデックスからコピーが開始されます。\r
-        /// </summary>\r
-        /// <param name="array"><c>ICollection</c>から要素がコピーされる1次元のArray。Arrayには、0から始まるインデックス番号が必要です。</param>\r
-        /// <param name="arrayIndex">コピーの開始位置となる、arrayの0から始まるインデックス。</param>\r
-        public void CopyTo(KeyValuePair<string, TValue>[] array, int arrayIndex)\r
-        {\r
-            // 入力値チェック\r
-            Validate.NotNull(array);\r
-            if (arrayIndex < 0)\r
-            {\r
-                throw new ArgumentOutOfRangeException("arrayIndex");\r
-            }\r
-\r
-            if (array.Length >= arrayIndex)\r
-            {\r
-                throw new ArgumentException("array.Length >= arrayIndex");\r
-            }\r
-\r
-            // 渡された情報をコピーする\r
-            for (int i = arrayIndex; i < array.Length; i++)\r
-            {\r
-                this[array[i].Key] = array[i].Value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// <c>ICollection</c>内で最初に見つかった特定のオブジェクトを削除します。\r
-        /// </summary>\r
-        /// <param name="item"><c>ICollection</c>から削除するオブジェクト。</param>\r
-        /// <returns>\r
-        /// itemが<c>ICollection</c>から正常に削除された場合は<c>true</c>。それ以外の場合は<c>false</c>。\r
-        /// このメソッドは、<c>item</c>が元の<c>ICollection</c>に見つからなかった場合にも<c>false</c>を返します。\r
-        /// </returns>\r
-        public bool Remove(KeyValuePair<string, TValue> item)\r
-        {\r
-            // 多少処理が冗長にはなるものの、下記メソッドを呼ぶことで実装\r
-            return this.Contains(item) && this.Remove(item.Key);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region ラップするインスタンスを参照するメソッド\r
-        \r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>GetEnumerator</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <returns>コレクションを反復処理するために使用できる<c>IEnumerator</c>オブジェクト。</returns>\r
-        public IEnumerator<KeyValuePair<string, TValue>> GetEnumerator()\r
-        {\r
-            return this.Dictionary.GetEnumerator();\r
-        }\r
-\r
-        /// <summary>\r
-        /// ラップする<c>IDictionary</c>インスタンスの<c>GetEnumerator</c>メソッドを呼び出す。\r
-        /// </summary>\r
-        /// <returns>コレクションを反復処理するために使用できる<c>IEnumerator</c>オブジェクト。</returns>\r
-        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r
-        {\r
-            return this.Dictionary.GetEnumerator();\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      大文字小文字を区別しないIDictionary実装のラッパークラスソース</summary>
+//
+// <copyright file="IgnoreCaseDictionary.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// 大文字小文字を区別しない<c>IDictionary</c>実装のラッパークラスです。
+    /// </summary>
+    /// <typeparam name="TValue">ディクショナリ内の値の型。</typeparam>
+    /// <remarks>
+    /// このクラスを使用して登録した値が、大文字小文字を区別しないことを保証する。
+    /// (内部的には大文字小文字を区別した値も保持する。
+    /// <c>Dictionary</c>プロパティより参照可。)
+    /// ただし、既にキー値に大文字小文字が異なるデータを含んでしまっている
+    /// <c>IDictionary</c>をラップした場合、動作は保証しない。
+    /// </remarks>
+    public class IgnoreCaseDictionary<TValue> : IDictionary<string, TValue>
+    {
+        #region private変数
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>実装クラスのインスタンス。
+        /// </summary>
+        private IDictionary<string, TValue> dictionary;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// 指定された<c>IDictionary</c>インスタンスをラップするインスタンスを生成。
+        /// </summary>
+        /// <param name="dictionary">ラップされるインスタンス。</param>
+        /// <remarks>インスタンスに大文字小文字違いのキー値が格納されている場合、動作は保障しない。</remarks>
+        public IgnoreCaseDictionary(IDictionary<string, TValue> dictionary)
+        {
+            this.Dictionary = dictionary;
+        }
+
+        /// <summary>
+        /// 空の<c>Dictionary</c>インスタンスをラップするインスタンスを生成。
+        /// </summary>
+        public IgnoreCaseDictionary()
+            : this(new Dictionary<string, TValue>())
+        {
+        }
+
+        #endregion
+
+        #region 独自実装公開プロパティ
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>実装クラスのインスタンス。
+        /// </summary>
+        /// <remarks>
+        /// getしたインスタンスへの変更はこのクラスに反映されない。
+        /// 必要ならsetで再度インスタンスを読み込ませること。
+        /// </remarks>
+        public IDictionary<string, TValue> Dictionary
+        {
+            get
+            {
+                return this.dictionary;
+            }
+
+            set
+            {
+                // 必須な情報が設定されていない場合、例外を返す
+                this.dictionary = Validate.NotNull(value);
+
+                // 大文字小文字を無視した検索用キー情報を作成する
+                this.KeyMap = new Dictionary<string, string>();
+                foreach (string key in this.dictionary.Keys)
+                {
+                    this.KeyMap[key.ToLower()] = key;
+                }
+            }
+        }
+
+        #endregion
+
+        #region ラップするインスタンスを参照するプロパティ
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>Keys</c>プロパティを呼び出す。
+        /// </summary>
+        public ICollection<string> Keys
+        {
+            get
+            {
+                return this.Dictionary.Keys;
+            }
+        }
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>Values</c>プロパティを呼び出す。
+        /// </summary>
+        public ICollection<TValue> Values
+        {
+            get
+            {
+                return this.Dictionary.Values;
+            }
+        }
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>Count</c>プロパティを呼び出す。
+        /// </summary>
+        public int Count
+        {
+            get
+            {
+                return this.Dictionary.Count;
+            }
+        }
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>IsReadOnly</c>プロパティを呼び出す。
+        /// </summary>
+        public bool IsReadOnly
+        {
+            get
+            {
+                return this.Dictionary.IsReadOnly;
+            }
+        }
+
+        #endregion
+
+        #region 内部実装用プロパティ
+
+        /// <summary>
+        /// 大文字小文字を無視したキー情報を格納するための<c>IDictionary</c>。
+        /// </summary>
+        /// <remarks>
+        /// 小文字変換後のキーと変換前のキーのマップ。
+        /// <c>Dictionary</c>プロパティと同期を取る必要がある。
+        /// </remarks>
+        protected IDictionary<string, string> KeyMap
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region 独自実装インデクサー
+
+        /// <summary>
+        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Item</c>プロパティを呼び出す。
+        /// </summary>
+        /// <param name="key">取得または設定する要素のキー。</param>
+        /// <returns>指定したキーを持つ要素。</returns>
+        public TValue this[string key]
+        {
+            get
+            {
+                // 小文字に変換し、マップを経てラップインスタンスにアクセス
+                // ※ nullの場合は事前にArgumentNullExceptionを投げる
+                //    またKeyがなければKeyNotFoundExceptionが飛ぶはず
+                return this.Dictionary[this.KeyMap[Validate.NotNull(key).ToLower()]];
+            }
+
+            set
+            {
+                // 小文字に変換し、マップを経てラップインスタンスにアクセス
+                // ※ nullの場合は事前にArgumentNullExceptionを投げる
+                //    またKeyがなければKeyNotFoundExceptionが飛ぶはず
+                string k = Validate.NotNull(key).ToLower();
+                string orgKey;
+                if (this.KeyMap.TryGetValue(k, out orgKey))
+                {
+                    // 大文字小文字が違う可能性があるので、
+                    // オリジナルデータは一旦削除して再登録する
+                    this.Dictionary.Remove(orgKey);
+                }
+
+                this.KeyMap[k] = key;
+                this.Dictionary[key] = value;
+            }
+        }
+
+        #endregion
+
+        #region 独自実装メソッド
+
+        /// <summary>
+        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Add</c>メソッドを呼び出す。
+        /// </summary>
+        /// <param name="key">追加する要素のキーとして使用するオブジェクト。</param>
+        /// <param name="value">追加する要素の値として使用するオブジェクト。</param>
+        public void Add(string key, TValue value)
+        {
+            // 小文字に変換し、マップを経てラップインスタンスにアクセス
+            // ※ nullの場合は事前にArgumentNullExceptionを投げる
+            string k = Validate.NotNull(key).ToLower();
+            this.KeyMap.Add(k, key);
+            this.Dictionary.Add(key, value);
+        }
+
+        /// <summary>
+        /// 大文字小文字を区別せず、指定したキーの要素が<c>IgnoreCaseDictionary</c>に格納されているかどうかを確認します。
+        /// </summary>
+        /// <param name="key"><c>IgnoreCaseDictionary</c>内で検索されるキー。</param>
+        /// <returns>指定したキーを持つ要素を<c>IgnoreCaseDictionary</c>が保持している場合は<c>true</c>。それ以外の場合は<c>false</c>。</returns>
+        public bool ContainsKey(string key)
+        {
+            // 同期が取れていることを前提に、キーマップのみ確認する
+            // (ラップインスタンスまで見ると、他の例外が起こりえて面倒なため)
+            // ※ nullの場合は事前にArgumentNullExceptionを投げる
+            return this.KeyMap.ContainsKey(Validate.NotNull(key).ToLower());
+        }
+
+        /// <summary>
+        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Remove</c>メソッドを呼び出す。
+        /// </summary>
+        /// <param name="key">削除する要素のキー。</param>
+        /// <returns>
+        /// 要素が正常に削除された場合は<c>true</c>。それ以外の場合は<c>false</c>。
+        /// このメソッドは、<c>key</c>が元の<c>IDictionary</c>に見つからなかった場合にも<c>false</c>を返します。
+        /// </returns>
+        public bool Remove(string key)
+        {
+            // 小文字に変換し、マップを経てラップインスタンスにアクセス
+            // ※ nullの場合は事前にArgumentNullExceptionを投げる
+            string k = Validate.NotNull(key).ToLower();
+            string orgKey;
+            bool removed = false;
+            if (this.KeyMap.TryGetValue(k, out orgKey))
+            {
+                removed = this.Dictionary.Remove(orgKey);
+            }
+
+            // どちらかが削除できていれば削除成功と返す
+            return this.KeyMap.Remove(k) || removed;
+        }
+
+        /// <summary>
+        /// 大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>TryGetValue</c>メソッドを呼び出す。
+        /// </summary>
+        /// <param name="key">値を取得する対象のキー。</param>
+        /// <param name="value">
+        /// このメソッドが返されるときに、キーが見つかった場合は、指定したキーに関連付けられている値。
+        /// それ以外の場合は<c>value</c>パラメーターの型に対する既定の値。このパラメーターは初期化せずに渡されます。</param>
+        /// <returns>
+        /// 指定したキーを持つ要素が<c>IDictionary</c>を実装するオブジェクトに格納されている場合は<c>true</c>。
+        /// それ以外の場合は<c>false</c>。
+        /// </returns>
+        public bool TryGetValue(string key, out TValue value)
+        {
+            // 返り値をそのクラスのデフォルト値で初期化
+            value = default(TValue);
+
+            // 小文字に変換し、マップを経てラップインスタンスにアクセス
+            // ※ nullの場合は事前にArgumentNullExceptionを投げる
+            string k = Validate.NotNull(key).ToLower();
+            string orgKey;
+            if (this.KeyMap.TryGetValue(k, out orgKey))
+            {
+                return this.Dictionary.TryGetValue(orgKey, out value);
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// キーの大文字小文字を区別せず、ラップする<c>IDictionary</c>インスタンスの<c>Add</c>メソッドを呼び出す。
+        /// </summary>
+        /// <param name="item"><c>ICollection</c>に追加するオブジェクト。</param>
+        public void Add(KeyValuePair<string, TValue> item)
+        {
+            // 小文字に変換し、マップを経てラップインスタンスにアクセス
+            // ※ nullの場合は事前にArgumentNullExceptionを投げる
+            string k = Validate.NotNull(item.Key).ToLower();
+            this.KeyMap.Add(k, item.Key);
+            this.Dictionary.Add(item);
+        }
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>Clear</c>メソッドを呼び出す。
+        /// </summary>
+        public void Clear()
+        {
+            this.KeyMap.Clear();
+            this.Dictionary.Clear();
+        }
+
+        /// <summary>
+        /// キーの大文字小文字を区別せず、<c>ICollection</c>に特定のキーと値が格納されているかどうかを判断します。
+        /// </summary>
+        /// <param name="item"><c>ICollection</c>内で検索される<c>KeyValuePair</c>構造体。</param>
+        /// <returns><c>KeyValuePair</c>が<c>ICollection</c>に存在する場合は<c>true</c>。それ以外の場合は<c>false</c>。</returns>
+        public bool Contains(KeyValuePair<string, TValue> item)
+        {
+            // 大文字小文字を区別しないキーと、値で判定する
+            if (item.Key == null)
+            {
+                // キー情報がnullの場合、このクラスでは検知できないのでNG
+                return false;
+            }
+
+            TValue value;
+            if (this.TryGetValue(item.Key, out value))
+            {
+                // キーから辿った値が一致していればOK
+                return ObjectUtils.Equals(item.Value, value);
+            }
+
+            // どこにも該当しなければ不一致なのでNG
+            return false;
+        }
+
+        /// <summary>
+        /// <c>ICollection</c>の要素をArrayにコピーします。Arrayの特定のインデックスからコピーが開始されます。
+        /// </summary>
+        /// <param name="array"><c>ICollection</c>から要素がコピーされる1次元のArray。Arrayには、0から始まるインデックス番号が必要です。</param>
+        /// <param name="arrayIndex">コピーの開始位置となる、arrayの0から始まるインデックス。</param>
+        public void CopyTo(KeyValuePair<string, TValue>[] array, int arrayIndex)
+        {
+            // 入力値チェック
+            Validate.NotNull(array);
+            if (arrayIndex < 0)
+            {
+                throw new ArgumentOutOfRangeException("arrayIndex");
+            }
+
+            if (array.Length >= arrayIndex)
+            {
+                throw new ArgumentException("array.Length >= arrayIndex");
+            }
+
+            // 渡された情報をコピーする
+            for (int i = arrayIndex; i < array.Length; i++)
+            {
+                this[array[i].Key] = array[i].Value;
+            }
+        }
+
+        /// <summary>
+        /// <c>ICollection</c>内で最初に見つかった特定のオブジェクトを削除します。
+        /// </summary>
+        /// <param name="item"><c>ICollection</c>から削除するオブジェクト。</param>
+        /// <returns>
+        /// itemが<c>ICollection</c>から正常に削除された場合は<c>true</c>。それ以外の場合は<c>false</c>。
+        /// このメソッドは、<c>item</c>が元の<c>ICollection</c>に見つからなかった場合にも<c>false</c>を返します。
+        /// </returns>
+        public bool Remove(KeyValuePair<string, TValue> item)
+        {
+            // 多少処理が冗長にはなるものの、下記メソッドを呼ぶことで実装
+            return this.Contains(item) && this.Remove(item.Key);
+        }
+
+        #endregion
+
+        #region ラップするインスタンスを参照するメソッド
+        
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>GetEnumerator</c>メソッドを呼び出す。
+        /// </summary>
+        /// <returns>コレクションを反復処理するために使用できる<c>IEnumerator</c>オブジェクト。</returns>
+        public IEnumerator<KeyValuePair<string, TValue>> GetEnumerator()
+        {
+            return this.Dictionary.GetEnumerator();
+        }
+
+        /// <summary>
+        /// ラップする<c>IDictionary</c>インスタンスの<c>GetEnumerator</c>メソッドを呼び出す。
+        /// </summary>
+        /// <returns>コレクションを反復処理するために使用できる<c>IEnumerator</c>オブジェクト。</returns>
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return this.Dictionary.GetEnumerator();
+        }
+
+        #endregion
+    }
+}
index c611aee..f8984c2 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      言語に関する情報をあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="Language.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// 言語に関する情報をあらわすモデルクラスです。\r
-    /// </summary>\r
-    public class Language : IXmlSerializable\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 言語のコード。\r
-        /// </summary>\r
-        private string code;\r
-\r
-        /// <summary>\r
-        /// この言語の、各言語での名称。\r
-        /// </summary>\r
-        private IDictionary<string, LanguageName> names = new Dictionary<string, LanguageName>();\r
-\r
-        /// <summary>\r
-        /// 括弧のフォーマット。\r
-        /// </summary>\r
-        private string bracket;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(通常)。\r
-        /// </summary>\r
-        /// <param name="code">言語のコード。</param>\r
-        public Language(string code)\r
-        {\r
-            // メンバ変数の初期設定\r
-            this.Code = code;\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(シリアライズ or 拡張用)。\r
-        /// </summary>\r
-        protected Language()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// 言語のコード。\r
-        /// </summary>\r
-        public string Code\r
-        {\r
-            get\r
-            {\r
-                return this.code;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.code = Validate.NotBlank(value, "code").ToLower();\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// この言語の、各言語での名称。\r
-        /// </summary>\r
-        /// <remarks>空でもオブジェクトは存在。</remarks>\r
-        public IDictionary<string, LanguageName> Names\r
-        {\r
-            get\r
-            {\r
-                return this.names;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.names = Validate.NotNull(value, "names");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 括弧のフォーマット。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public string Bracket\r
-        {\r
-            get\r
-            {\r
-                if (String.IsNullOrWhiteSpace(this.bracket))\r
-                {\r
-                    return Settings.Default.Bracket;\r
-                }\r
-\r
-                return this.bracket;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.bracket = value;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッド\r
-\r
-        /// <summary>\r
-        /// シリアライズするXMLのスキーマ定義を返す。\r
-        /// </summary>\r
-        /// <returns>XML表現を記述するXmlSchema。</returns>\r
-        public System.Xml.Schema.XmlSchema GetSchema()\r
-        {\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLからオブジェクトをデシリアライズする。\r
-        /// </summary>\r
-        /// <param name="reader">デシリアライズ元のXmlReader</param>\r
-        public void ReadXml(XmlReader reader)\r
-        {\r
-            XmlDocument xml = new XmlDocument();\r
-            xml.Load(reader);\r
-\r
-            // Webサイトの言語情報\r
-            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-            XmlElement langElement = xml.DocumentElement;\r
-            this.Code = langElement.GetAttribute("Code");\r
-            this.Bracket = XmlUtils.InnerText(langElement.SelectSingleNode("Bracket"));\r
-\r
-            // 言語の呼称情報\r
-            foreach (XmlNode nameNode in langElement.SelectNodes("Names/LanguageName"))\r
-            {\r
-                XmlElement nameElement = nameNode as XmlElement;\r
-                this.Names[nameElement.GetAttribute("Code")] = new LanguageName\r
-                {\r
-                    Name = XmlUtils.InnerText(nameElement.SelectSingleNode("Name")),\r
-                    ShortName = XmlUtils.InnerText(nameElement.SelectSingleNode("ShortName"))\r
-                };\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトをXMLにシリアライズする。\r
-        /// </summary>\r
-        /// <param name="writer">シリアライズ先のXmlWriter</param>\r
-        public void WriteXml(XmlWriter writer)\r
-        {\r
-            // Webサイトの言語情報\r
-            writer.WriteAttributeString("Code", this.Code);\r
-\r
-            // 言語の呼称情報\r
-            writer.WriteStartElement("Names");\r
-            foreach (KeyValuePair<string, LanguageName> name in this.Names)\r
-            {\r
-                writer.WriteStartElement("LanguageName");\r
-                writer.WriteAttributeString("Code", name.Key);\r
-                writer.WriteElementString("Name", name.Value.Name);\r
-                writer.WriteElementString("ShortName", name.Value.ShortName);\r
-                writer.WriteEndElement();\r
-            }\r
-\r
-            writer.WriteEndElement();\r
-            writer.WriteElementString("Bracket", this.bracket);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 構造体\r
-\r
-        /// <summary>\r
-        /// ある言語の、各言語での名称・略称を格納するための構造体です。\r
-        /// </summary>\r
-        public struct LanguageName\r
-        {\r
-            /// <summary>\r
-            /// 言語の名称。\r
-            /// </summary>\r
-            public string Name;\r
-\r
-            /// <summary>\r
-            /// 言語の略称。\r
-            /// </summary>\r
-            public string ShortName;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      言語に関する情報をあらわすモデルクラスソース</summary>
+//
+// <copyright file="Language.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// 言語に関する情報をあらわすモデルクラスです。
+    /// </summary>
+    public class Language : IXmlSerializable
+    {
+        #region private変数
+
+        /// <summary>
+        /// 言語のコード。
+        /// </summary>
+        private string code;
+
+        /// <summary>
+        /// この言語の、各言語での名称。
+        /// </summary>
+        private IDictionary<string, LanguageName> names = new Dictionary<string, LanguageName>();
+
+        /// <summary>
+        /// 括弧のフォーマット。
+        /// </summary>
+        private string bracket;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ(通常)。
+        /// </summary>
+        /// <param name="code">言語のコード。</param>
+        public Language(string code)
+        {
+            // メンバ変数の初期設定
+            this.Code = code;
+        }
+
+        /// <summary>
+        /// コンストラクタ(シリアライズ or 拡張用)。
+        /// </summary>
+        protected Language()
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// 言語のコード。
+        /// </summary>
+        public string Code
+        {
+            get
+            {
+                return this.code;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.code = Validate.NotBlank(value, "code").ToLower();
+            }
+        }
+
+        /// <summary>
+        /// この言語の、各言語での名称。
+        /// </summary>
+        /// <remarks>空でもオブジェクトは存在。</remarks>
+        public IDictionary<string, LanguageName> Names
+        {
+            get
+            {
+                return this.names;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.names = Validate.NotNull(value, "names");
+            }
+        }
+
+        /// <summary>
+        /// 括弧のフォーマット。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public string Bracket
+        {
+            get
+            {
+                if (String.IsNullOrWhiteSpace(this.bracket))
+                {
+                    return Settings.Default.Bracket;
+                }
+
+                return this.bracket;
+            }
+
+            set
+            {
+                this.bracket = value;
+            }
+        }
+
+        #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 langElement = xml.DocumentElement;
+            this.Code = langElement.GetAttribute("Code");
+            this.Bracket = XmlUtils.InnerText(langElement.SelectSingleNode("Bracket"));
+
+            // 言語の呼称情報
+            foreach (XmlNode nameNode in langElement.SelectNodes("Names/LanguageName"))
+            {
+                XmlElement nameElement = nameNode as XmlElement;
+                this.Names[nameElement.GetAttribute("Code")] = new LanguageName
+                {
+                    Name = XmlUtils.InnerText(nameElement.SelectSingleNode("Name")),
+                    ShortName = XmlUtils.InnerText(nameElement.SelectSingleNode("ShortName"))
+                };
+            }
+        }
+
+        /// <summary>
+        /// オブジェクトをXMLにシリアライズする。
+        /// </summary>
+        /// <param name="writer">シリアライズ先のXmlWriter</param>
+        public void WriteXml(XmlWriter writer)
+        {
+            // Webサイトの言語情報
+            writer.WriteAttributeString("Code", this.Code);
+
+            // 言語の呼称情報
+            writer.WriteStartElement("Names");
+            foreach (KeyValuePair<string, LanguageName> name in this.Names)
+            {
+                writer.WriteStartElement("LanguageName");
+                writer.WriteAttributeString("Code", name.Key);
+                writer.WriteElementString("Name", name.Value.Name);
+                writer.WriteElementString("ShortName", name.Value.ShortName);
+                writer.WriteEndElement();
+            }
+
+            writer.WriteEndElement();
+            writer.WriteElementString("Bracket", this.bracket);
+        }
+
+        #endregion
+
+        #region 構造体
+
+        /// <summary>
+        /// ある言語の、各言語での名称・略称を格納するための構造体です。
+        /// </summary>
+        public struct LanguageName
+        {
+            /// <summary>
+            /// 言語の名称。
+            /// </summary>
+            public string Name;
+
+            /// <summary>
+            /// 言語の略称。
+            /// </summary>
+            public string ShortName;
+        }
+
+        #endregion
+    }
+}
index 4302895..ecb5e2c 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      MediaWikiのウェブサイト(システム)をあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="MediaWiki.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Web;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// MediaWikiのウェブサイト(システム)をあらわすモデルクラスです。\r
-    /// </summary>\r
-    public class MediaWiki : Website, IXmlSerializable\r
-    {\r
-        #region private変数\r
-        \r
-        /// <summary>\r
-        /// 名前空間情報取得用にアクセスするAPI。\r
-        /// </summary>\r
-        private string namespacePath;\r
-\r
-        /// <summary>\r
-        /// 記事のXMLデータが存在するパス。\r
-        /// </summary>\r
-        private string exportPath;\r
-\r
-        /// <summary>\r
-        /// リダイレクトの文字列。\r
-        /// </summary>\r
-        private string redirect;\r
-\r
-        /// <summary>\r
-        /// テンプレートの名前空間を示す番号。\r
-        /// </summary>\r
-        private int? templateNamespace;\r
-\r
-        /// <summary>\r
-        /// カテゴリの名前空間を示す番号。\r
-        /// </summary>\r
-        private int? categoryNamespace;\r
-\r
-        /// <summary>\r
-        /// 画像の名前空間を示す番号。\r
-        /// </summary>\r
-        private int? fileNamespace;\r
-\r
-        /// <summary>\r
-        /// Wikipedia書式のシステム定義変数。\r
-        /// </summary>\r
-        /// <remarks>初期値は http://www.mediawiki.org/wiki/Help:Magic_words を参照</remarks>\r
-        private IList<string> magicWords;\r
-\r
-        /// <summary>\r
-        /// MediaWikiの名前空間の情報。\r
-        /// </summary>\r
-        private IDictionary<int, IList<string>> namespaces = new Dictionary<int, IList<string>>();\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(MediaWiki全般)。\r
-        /// </summary>\r
-        /// <param name="language">ウェブサイトの言語。</param>\r
-        /// <param name="location">ウェブサイトの場所。</param>\r
-        public MediaWiki(Language language, string location)\r
-        {\r
-            // メンバ変数の初期設定\r
-            this.Language = language;\r
-            this.Location = location;\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(Wikipedia用)。\r
-        /// </summary>\r
-        /// <param name="language">ウェブサイトの言語。</param>\r
-        public MediaWiki(Language language)\r
-        {\r
-            // メンバ変数の初期設定\r
-            // ※ オーバーロードメソッドを呼んでいないのは、languageがnullのときに先にエラーになるから\r
-            this.Language = language;\r
-            this.Location = String.Format(Settings.Default.WikipediaLocation, language.Code);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(シリアライズ or 拡張用)。\r
-        /// </summary>\r
-        protected MediaWiki()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 設定ファイルに初期値を持つプロパティ\r
-        \r
-        /// <summary>\r
-        /// MediaWiki名前空間情報取得用にアクセスするAPI。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public string NamespacePath\r
-        {\r
-            get\r
-            {\r
-                if (String.IsNullOrEmpty(this.namespacePath))\r
-                {\r
-                    return Settings.Default.MediaWikiNamespacePath;\r
-                }\r
-\r
-                return this.namespacePath;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.namespacePath = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 記事のXMLデータが存在するパス。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public string ExportPath\r
-        {\r
-            get\r
-            {\r
-                if (String.IsNullOrEmpty(this.exportPath))\r
-                {\r
-                    return Settings.Default.MediaWikiExportPath;\r
-                }\r
-\r
-                return this.exportPath;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.exportPath = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// リダイレクトの文字列。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public string Redirect\r
-        {\r
-            get\r
-            {\r
-                if (String.IsNullOrEmpty(this.redirect))\r
-                {\r
-                    return Settings.Default.MediaWikiRedirect;\r
-                }\r
-\r
-                return this.redirect;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.redirect = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テンプレートの名前空間を示す番号。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public int TemplateNamespace\r
-        {\r
-            get\r
-            {\r
-                return this.templateNamespace ?? Settings.Default.MediaWikiTemplateNamespace;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.templateNamespace = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// カテゴリの名前空間を示す番号。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public int CategoryNamespace\r
-        {\r
-            get\r
-            {\r
-                return this.categoryNamespace ?? Settings.Default.MediaWikiCategoryNamespace;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.categoryNamespace = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 画像の名前空間を示す番号。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public int FileNamespace\r
-        {\r
-            get\r
-            {\r
-                return this.fileNamespace ?? Settings.Default.MediaWikiFileNamespace;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.fileNamespace = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// Wikipedia書式のシステム定義変数。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>\r
-        public IList<string> MagicWords\r
-        {\r
-            get\r
-            {\r
-                if (this.magicWords == null)\r
-                {\r
-                    string[] w = new string[Settings.Default.MediaWikiMagicWords.Count];\r
-                    Settings.Default.MediaWikiMagicWords.CopyTo(w, 0);\r
-                    return w;\r
-                }\r
-\r
-                return this.magicWords;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.magicWords = value;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region それ以外のプロパティ\r
-\r
-        /// <summary>\r
-        /// MediaWikiの名前空間の情報。\r
-        /// </summary>\r
-        /// <remarks>値が指定されていない場合、サーバーから情報を取得。</remarks>\r
-        public IDictionary<int, IList<string>> Namespaces\r
-        {\r
-            get\r
-            {\r
-                lock (this.namespaces)\r
-                {\r
-                    // 値が設定されていない場合、サーバーから取得して初期化する\r
-                    // ※ コンストラクタ等で初期化していないのは、通信の準備が整うまで行えないため\r
-                    // ※ MagicWordsがnullでこちらが空で若干条件が違うのは、あちらは設定ファイルに\r
-                    //    保存する設定だが、こちらは設定ファイルに保存しない基本的に読み込み用の設定だから。\r
-                    if (this.namespaces.Count > 0)\r
-                    {\r
-                        return this.namespaces;\r
-                    }\r
-\r
-                    // APIのXMLデータをMediaWikiサーバーから取得\r
-                    XmlDocument xml = new XmlDocument();\r
-                    using (Stream reader = this.GetStream(new Uri(new Uri(this.Location), this.NamespacePath)))\r
-                    {\r
-                        xml.Load(reader);\r
-                    }\r
-\r
-                    // ルートエレメントまで取得し、フォーマットをチェック\r
-                    XmlElement rootElement = xml["api"];\r
-                    if (rootElement == null)\r
-                    {\r
-                        // XMLは取得できたが空 or フォーマットが想定外\r
-                        throw new InvalidDataException("parse failed");\r
-                    }\r
-\r
-                    // クエリーを取得\r
-                    XmlElement queryElement = rootElement["query"];\r
-                    if (queryElement == null)\r
-                    {\r
-                        // フォーマットが想定外\r
-                        throw new InvalidDataException("parse failed");\r
-                    }\r
-\r
-                    // ネームスペースブロックを取得、ネームスペースブロックまでは必須\r
-                    XmlElement namespacesElement = queryElement["namespaces"];\r
-                    if (namespacesElement == null)\r
-                    {\r
-                        // フォーマットが想定外\r
-                        throw new InvalidDataException("parse failed");\r
-                    }\r
-\r
-                    // ネームスペースを取得\r
-                    foreach (XmlNode node in namespacesElement.ChildNodes)\r
-                    {\r
-                        XmlElement namespaceElement = node as XmlElement;\r
-                        if (namespaceElement != null)\r
-                        {\r
-                            try\r
-                            {\r
-                                int id = Decimal.ToInt16(Decimal.Parse(namespaceElement.GetAttribute("id")));\r
-                                IList<string> values = new List<string>();\r
-                                values.Add(namespaceElement.InnerText);\r
-                                this.namespaces[id] = values;\r
-\r
-                                // あればシステム名?も設定\r
-                                string canonical = namespaceElement.GetAttribute("canonical");\r
-                                if (!String.IsNullOrEmpty(canonical))\r
-                                {\r
-                                    values.Add(canonical);\r
-                                }\r
-                            }\r
-                            catch (Exception e)\r
-                            {\r
-                                // キャッチしているのは、万が一想定外の書式が返された場合に、完璧に動かなくなるのを防ぐため\r
-                                System.Diagnostics.Debug.WriteLine("MediaWiki.Namespaces > 例外発生 : " + e);\r
-                            }\r
-                        }\r
-                    }\r
-\r
-                    // ネームスペースエイリアスブロックを取得、無い場合も想定\r
-                    XmlElement aliasesElement = queryElement["namespacealiases"];\r
-                    if (aliasesElement != null)\r
-                    {\r
-                        // ネームスペースエイリアスを取得\r
-                        foreach (XmlNode node in aliasesElement.ChildNodes)\r
-                        {\r
-                            XmlElement namespaceElement = node as XmlElement;\r
-                            if (namespaceElement != null)\r
-                            {\r
-                                try\r
-                                {\r
-                                    int id = Decimal.ToInt16(Decimal.Parse(namespaceElement.GetAttribute("id")));\r
-                                    IList<string> values = new List<string>();\r
-                                    if (this.namespaces.ContainsKey(id))\r
-                                    {\r
-                                        values = this.namespaces[id];\r
-                                    }\r
-\r
-                                    values.Add(namespaceElement.InnerText);\r
-                                }\r
-                                catch (Exception e)\r
-                                {\r
-                                    // キャッチしているのは、万が一想定外の書式が返された場合に、完璧に動かなくなるのを防ぐため\r
-                                    System.Diagnostics.Debug.WriteLine("MediaWiki.Namespaces > 例外発生 : " + e);\r
-                                }\r
-                            }\r
-                        }\r
-                    }\r
-                }\r
-\r
-                return this.namespaces;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、ArgumentNullExceptionを返す\r
-                if (value == null)\r
-                {\r
-                    throw new ArgumentNullException("namespaces");\r
-                }\r
-\r
-                this.namespaces = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// Template:Documentation(言語間リンク等を別ページに記述するためのテンプレート)に相当するページ名。\r
-        /// </summary>\r
-        /// <remarks>空の場合、その言語版にはこれに相当する機能は無いものとして扱う。</remarks>\r
-        public string DocumentationTemplate\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// Template:Documentationで指定が無い場合に参照するページ名。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// ほとんどの言語では[[/Doc]]の模様。\r
-        /// 空の場合、明示的な指定が無い場合は参照不能として扱う。\r
-        /// </remarks>\r
-        public string DocumentationTemplateDefaultPage\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開メソッド\r
-\r
-        /// <summary>\r
-        /// ページを取得。\r
-        /// </summary>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <returns>取得したページ。</returns>\r
-        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-        public override Page GetPage(string title)\r
-        {\r
-            // &amp; &nbsp; 等の特殊文字をデコード\r
-            // ※ 本当は呼び元側ですべき処理の気がするが、現状手ごろな場所が無いので\r
-            string decodeTitle = HttpUtility.HtmlDecode(title);\r
-\r
-            // fileスキームの場合、記事名からファイルに使えない文字をエスケープ\r
-            // ※ 仕組み的な処理はWebsite側に置きたいが、向こうではタイトルだけを抽出できないので\r
-            string escapeTitle = decodeTitle;\r
-            if (new Uri(this.Location).Scheme == "file")\r
-            {\r
-                escapeTitle = FormUtils.ReplaceInvalidFileNameChars(title);\r
-            }\r
-\r
-            // ページのXMLデータをMediaWikiサーバーから取得\r
-            XmlDocument xml = new XmlDocument();\r
-            using (Stream reader = this.GetStream(\r
-                new Uri(new Uri(this.Location), String.Format(this.ExportPath, escapeTitle))))\r
-            {\r
-                xml.Load(reader);\r
-            }\r
-\r
-            // ルートエレメントまで取得し、フォーマットをチェック\r
-            XmlElement rootElement = xml["mediawiki"];\r
-            if (rootElement == null)\r
-            {\r
-                // XMLは取得できたが空 or フォーマットが想定外\r
-                throw new InvalidDataException("parse failed");\r
-            }\r
-\r
-            // ページの解析\r
-            XmlElement pageElement = rootElement["page"];\r
-            if (pageElement == null)\r
-            {\r
-                // ページ無し\r
-                throw new FileNotFoundException("page not found");\r
-            }\r
-\r
-            // ページ名、ページ本文、最終更新日時\r
-            // ※ 一応、各項目が無くても動作するようにする\r
-            string pageTitle = XmlUtils.InnerText(pageElement["title"], title);\r
-            string text = null;\r
-            DateTime? time = null;\r
-            XmlElement revisionElement = pageElement["revision"];\r
-            if (revisionElement != null)\r
-            {\r
-                text = XmlUtils.InnerText(revisionElement["text"], null);\r
-                XmlElement timeElement = revisionElement["timestamp"];\r
-                if (timeElement != null)\r
-                {\r
-                    time = new DateTime?(DateTime.Parse(timeElement.InnerText));\r
-                }\r
-            }\r
-\r
-            // ページ情報を作成して返す\r
-            return new MediaWikiPage(this, pageTitle, text, time);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定された文字列がWikipediaのシステム変数に相当かを判定。\r
-        /// </summary>\r
-        /// <param name="text">チェックする文字列。</param>\r
-        /// <returns><c>true</c> システム変数に相当。</returns>\r
-        public bool IsMagicWord(string text)\r
-        {\r
-            string s = text != null ? text : String.Empty;\r
-\r
-            // {{CURRENTYEAR}}や{{ns:1}}みたいなパターンがある\r
-            foreach (string variable in this.MagicWords)\r
-            {\r
-                if (s == variable || s.StartsWith(variable + ":"))\r
-                {\r
-                    return true;\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-        \r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッド\r
-\r
-        /// <summary>\r
-        /// シリアライズするXMLのスキーマ定義を返す。\r
-        /// </summary>\r
-        /// <returns>XML表現を記述するXmlSchema。</returns>\r
-        public System.Xml.Schema.XmlSchema GetSchema()\r
-        {\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLからオブジェクトをデシリアライズする。\r
-        /// </summary>\r
-        /// <param name="reader">デシリアライズ元のXmlReader</param>\r
-        public void ReadXml(XmlReader reader)\r
-        {\r
-            XmlDocument xml = new XmlDocument();\r
-            xml.Load(reader);\r
-\r
-            // Webサイト\r
-            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-            XmlElement siteElement = xml.DocumentElement;\r
-            this.Location = siteElement.SelectSingleNode("Location").InnerText;\r
-\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader(siteElement.SelectSingleNode("Language").OuterXml), reader.Settings))\r
-            {\r
-                this.Language = new XmlSerializer(typeof(Language)).Deserialize(r) as Language;\r
-            }\r
-\r
-            this.NamespacePath = XmlUtils.InnerText(siteElement.SelectSingleNode("NamespacePath"));\r
-            this.ExportPath = XmlUtils.InnerText(siteElement.SelectSingleNode("ExportPath"));\r
-            this.Redirect = XmlUtils.InnerText(siteElement.SelectSingleNode("Redirect"));\r
-\r
-            string text = XmlUtils.InnerText(siteElement.SelectSingleNode("TemplateNamespace"));\r
-            if (!String.IsNullOrEmpty(text))\r
-            {\r
-                this.TemplateNamespace = int.Parse(text);\r
-            }\r
-\r
-            text = XmlUtils.InnerText(siteElement.SelectSingleNode("CategoryNamespace"));\r
-            if (!String.IsNullOrEmpty(text))\r
-            {\r
-                this.CategoryNamespace = int.Parse(text);\r
-            }\r
-\r
-            text = XmlUtils.InnerText(siteElement.SelectSingleNode("FileNamespace"));\r
-            if (!String.IsNullOrEmpty(text))\r
-            {\r
-                this.FileNamespace = int.Parse(text);\r
-            }\r
-\r
-            // システム定義変数\r
-            IList<string> variables = new List<string>();\r
-            foreach (XmlNode variableNode in siteElement.SelectNodes("MagicWords/Variable"))\r
-            {\r
-                variables.Add(variableNode.InnerText);\r
-            }\r
-\r
-            if (variables.Count > 0)\r
-            {\r
-                // 初期値の都合上、値がある場合のみ\r
-                this.MagicWords = variables;\r
-            }\r
-\r
-            // Template:Documentationの設定\r
-            XmlElement docElement = siteElement.SelectSingleNode("DocumentationTemplate") as XmlElement;\r
-            if (docElement != null)\r
-            {\r
-                this.DocumentationTemplate = docElement.InnerText;\r
-                this.DocumentationTemplateDefaultPage = docElement.GetAttribute("DefaultPage");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトをXMLにシリアライズする。\r
-        /// </summary>\r
-        /// <param name="writer">シリアライズ先のXmlWriter</param>\r
-        public void WriteXml(XmlWriter writer)\r
-        {\r
-            writer.WriteElementString("Location", this.Location);\r
-            new XmlSerializer(this.Language.GetType()).Serialize(writer, this.Language);\r
-\r
-            // MediaWiki固有の情報\r
-            // ※ 設定ファイルに初期値を持つものは、プロパティではなく値から出力\r
-            writer.WriteElementString("NamespacePath", this.namespacePath);\r
-            writer.WriteElementString("ExportPath", this.exportPath);\r
-            writer.WriteElementString("Redirect", this.redirect);\r
-            writer.WriteElementString(\r
-                "TemplateNamespace",\r
-                this.templateNamespace.HasValue ? this.templateNamespace.ToString() : String.Empty);\r
-            writer.WriteElementString(\r
-                "CategoryNamespace",\r
-                this.templateNamespace.HasValue ? this.categoryNamespace.ToString() : String.Empty);\r
-            writer.WriteElementString(\r
-                "FileNamespace",\r
-                this.templateNamespace.HasValue ? this.fileNamespace.ToString() : String.Empty);\r
-\r
-            // システム定義変数\r
-            writer.WriteStartElement("MagicWords");\r
-            if (this.magicWords != null)\r
-            {\r
-                foreach (string variable in this.magicWords)\r
-                {\r
-                    writer.WriteElementString("Variable", variable);\r
-                }\r
-            }\r
-\r
-            writer.WriteEndElement();\r
-\r
-            // Template:Documentationの設定は一項目で出力\r
-            if (!String.IsNullOrEmpty(this.DocumentationTemplate))\r
-            {\r
-                writer.WriteStartElement("DocumentationTemplate");\r
-                writer.WriteAttributeString("DefaultPage", this.DocumentationTemplateDefaultPage);\r
-                writer.WriteValue(this.DocumentationTemplate);\r
-                writer.WriteEndElement();\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      MediaWikiのウェブサイト(システム)をあらわすモデルクラスソース</summary>
+//
+// <copyright file="MediaWiki.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Web;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// MediaWikiのウェブサイト(システム)をあらわすモデルクラスです。
+    /// </summary>
+    public class MediaWiki : Website, IXmlSerializable
+    {
+        #region private変数
+        
+        /// <summary>
+        /// 名前空間情報取得用にアクセスするAPI。
+        /// </summary>
+        private string namespacePath;
+
+        /// <summary>
+        /// 記事のXMLデータが存在するパス。
+        /// </summary>
+        private string exportPath;
+
+        /// <summary>
+        /// リダイレクトの文字列。
+        /// </summary>
+        private string redirect;
+
+        /// <summary>
+        /// テンプレートの名前空間を示す番号。
+        /// </summary>
+        private int? templateNamespace;
+
+        /// <summary>
+        /// カテゴリの名前空間を示す番号。
+        /// </summary>
+        private int? categoryNamespace;
+
+        /// <summary>
+        /// 画像の名前空間を示す番号。
+        /// </summary>
+        private int? fileNamespace;
+
+        /// <summary>
+        /// Wikipedia書式のシステム定義変数。
+        /// </summary>
+        /// <remarks>初期値は http://www.mediawiki.org/wiki/Help:Magic_words を参照</remarks>
+        private IList<string> magicWords;
+
+        /// <summary>
+        /// MediaWikiの名前空間の情報。
+        /// </summary>
+        private IDictionary<int, IList<string>> namespaces = new Dictionary<int, IList<string>>();
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ(MediaWiki全般)。
+        /// </summary>
+        /// <param name="language">ウェブサイトの言語。</param>
+        /// <param name="location">ウェブサイトの場所。</param>
+        public MediaWiki(Language language, string location)
+        {
+            // メンバ変数の初期設定
+            this.Language = language;
+            this.Location = location;
+        }
+
+        /// <summary>
+        /// コンストラクタ(Wikipedia用)。
+        /// </summary>
+        /// <param name="language">ウェブサイトの言語。</param>
+        public MediaWiki(Language language)
+        {
+            // メンバ変数の初期設定
+            // ※ オーバーロードメソッドを呼んでいないのは、languageがnullのときに先にエラーになるから
+            this.Language = language;
+            this.Location = String.Format(Settings.Default.WikipediaLocation, language.Code);
+        }
+
+        /// <summary>
+        /// コンストラクタ(シリアライズ or 拡張用)。
+        /// </summary>
+        protected MediaWiki()
+        {
+        }
+
+        #endregion
+
+        #region 設定ファイルに初期値を持つプロパティ
+        
+        /// <summary>
+        /// MediaWiki名前空間情報取得用にアクセスするAPI。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public string NamespacePath
+        {
+            get
+            {
+                if (String.IsNullOrEmpty(this.namespacePath))
+                {
+                    return Settings.Default.MediaWikiNamespacePath;
+                }
+
+                return this.namespacePath;
+            }
+
+            set
+            {
+                this.namespacePath = value;
+            }
+        }
+
+        /// <summary>
+        /// 記事のXMLデータが存在するパス。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public string ExportPath
+        {
+            get
+            {
+                if (String.IsNullOrEmpty(this.exportPath))
+                {
+                    return Settings.Default.MediaWikiExportPath;
+                }
+
+                return this.exportPath;
+            }
+
+            set
+            {
+                this.exportPath = value;
+            }
+        }
+
+        /// <summary>
+        /// リダイレクトの文字列。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public string Redirect
+        {
+            get
+            {
+                if (String.IsNullOrEmpty(this.redirect))
+                {
+                    return Settings.Default.MediaWikiRedirect;
+                }
+
+                return this.redirect;
+            }
+
+            set
+            {
+                this.redirect = value;
+            }
+        }
+
+        /// <summary>
+        /// テンプレートの名前空間を示す番号。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public int TemplateNamespace
+        {
+            get
+            {
+                return this.templateNamespace ?? Settings.Default.MediaWikiTemplateNamespace;
+            }
+
+            set
+            {
+                this.templateNamespace = value;
+            }
+        }
+
+        /// <summary>
+        /// カテゴリの名前空間を示す番号。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public int CategoryNamespace
+        {
+            get
+            {
+                return this.categoryNamespace ?? Settings.Default.MediaWikiCategoryNamespace;
+            }
+
+            set
+            {
+                this.categoryNamespace = value;
+            }
+        }
+
+        /// <summary>
+        /// 画像の名前空間を示す番号。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public int FileNamespace
+        {
+            get
+            {
+                return this.fileNamespace ?? Settings.Default.MediaWikiFileNamespace;
+            }
+
+            set
+            {
+                this.fileNamespace = value;
+            }
+        }
+
+        /// <summary>
+        /// Wikipedia書式のシステム定義変数。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、デフォルト値を返す。</remarks>
+        public IList<string> MagicWords
+        {
+            get
+            {
+                if (this.magicWords == null)
+                {
+                    string[] w = new string[Settings.Default.MediaWikiMagicWords.Count];
+                    Settings.Default.MediaWikiMagicWords.CopyTo(w, 0);
+                    return w;
+                }
+
+                return this.magicWords;
+            }
+
+            set
+            {
+                this.magicWords = value;
+            }
+        }
+
+        #endregion
+
+        #region それ以外のプロパティ
+
+        /// <summary>
+        /// MediaWikiの名前空間の情報。
+        /// </summary>
+        /// <remarks>値が指定されていない場合、サーバーから情報を取得。</remarks>
+        public IDictionary<int, IList<string>> Namespaces
+        {
+            get
+            {
+                lock (this.namespaces)
+                {
+                    // 値が設定されていない場合、サーバーから取得して初期化する
+                    // ※ コンストラクタ等で初期化していないのは、通信の準備が整うまで行えないため
+                    // ※ MagicWordsがnullでこちらが空で若干条件が違うのは、あちらは設定ファイルに
+                    //    保存する設定だが、こちらは設定ファイルに保存しない基本的に読み込み用の設定だから。
+                    if (this.namespaces.Count > 0)
+                    {
+                        return this.namespaces;
+                    }
+
+                    // APIのXMLデータをMediaWikiサーバーから取得
+                    XmlDocument xml = new XmlDocument();
+                    using (Stream reader = this.GetStream(new Uri(new Uri(this.Location), this.NamespacePath)))
+                    {
+                        xml.Load(reader);
+                    }
+
+                    // ルートエレメントまで取得し、フォーマットをチェック
+                    XmlElement rootElement = xml["api"];
+                    if (rootElement == null)
+                    {
+                        // XMLは取得できたが空 or フォーマットが想定外
+                        throw new InvalidDataException("parse failed");
+                    }
+
+                    // クエリーを取得
+                    XmlElement queryElement = rootElement["query"];
+                    if (queryElement == null)
+                    {
+                        // フォーマットが想定外
+                        throw new InvalidDataException("parse failed");
+                    }
+
+                    // ネームスペースブロックを取得、ネームスペースブロックまでは必須
+                    XmlElement namespacesElement = queryElement["namespaces"];
+                    if (namespacesElement == null)
+                    {
+                        // フォーマットが想定外
+                        throw new InvalidDataException("parse failed");
+                    }
+
+                    // ネームスペースを取得
+                    foreach (XmlNode node in namespacesElement.ChildNodes)
+                    {
+                        XmlElement namespaceElement = node as XmlElement;
+                        if (namespaceElement != null)
+                        {
+                            try
+                            {
+                                int id = Decimal.ToInt16(Decimal.Parse(namespaceElement.GetAttribute("id")));
+                                IList<string> values = new List<string>();
+                                values.Add(namespaceElement.InnerText);
+                                this.namespaces[id] = values;
+
+                                // あればシステム名?も設定
+                                string canonical = namespaceElement.GetAttribute("canonical");
+                                if (!String.IsNullOrEmpty(canonical))
+                                {
+                                    values.Add(canonical);
+                                }
+                            }
+                            catch (Exception e)
+                            {
+                                // キャッチしているのは、万が一想定外の書式が返された場合に、完璧に動かなくなるのを防ぐため
+                                System.Diagnostics.Debug.WriteLine("MediaWiki.Namespaces > 例外発生 : " + e);
+                            }
+                        }
+                    }
+
+                    // ネームスペースエイリアスブロックを取得、無い場合も想定
+                    XmlElement aliasesElement = queryElement["namespacealiases"];
+                    if (aliasesElement != null)
+                    {
+                        // ネームスペースエイリアスを取得
+                        foreach (XmlNode node in aliasesElement.ChildNodes)
+                        {
+                            XmlElement namespaceElement = node as XmlElement;
+                            if (namespaceElement != null)
+                            {
+                                try
+                                {
+                                    int id = Decimal.ToInt16(Decimal.Parse(namespaceElement.GetAttribute("id")));
+                                    IList<string> values = new List<string>();
+                                    if (this.namespaces.ContainsKey(id))
+                                    {
+                                        values = this.namespaces[id];
+                                    }
+
+                                    values.Add(namespaceElement.InnerText);
+                                }
+                                catch (Exception e)
+                                {
+                                    // キャッチしているのは、万が一想定外の書式が返された場合に、完璧に動かなくなるのを防ぐため
+                                    System.Diagnostics.Debug.WriteLine("MediaWiki.Namespaces > 例外発生 : " + e);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                return this.namespaces;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、ArgumentNullExceptionを返す
+                if (value == null)
+                {
+                    throw new ArgumentNullException("namespaces");
+                }
+
+                this.namespaces = value;
+            }
+        }
+
+        /// <summary>
+        /// Template:Documentation(言語間リンク等を別ページに記述するためのテンプレート)に相当するページ名。
+        /// </summary>
+        /// <remarks>空の場合、その言語版にはこれに相当する機能は無いものとして扱う。</remarks>
+        public string DocumentationTemplate
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Template:Documentationで指定が無い場合に参照するページ名。
+        /// </summary>
+        /// <remarks>
+        /// ほとんどの言語では[[/Doc]]の模様。
+        /// 空の場合、明示的な指定が無い場合は参照不能として扱う。
+        /// </remarks>
+        public string DocumentationTemplateDefaultPage
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region 公開メソッド
+
+        /// <summary>
+        /// ページを取得。
+        /// </summary>
+        /// <param name="title">ページタイトル。</param>
+        /// <returns>取得したページ。</returns>
+        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+        public override Page GetPage(string title)
+        {
+            // &amp; &nbsp; 等の特殊文字をデコード
+            // ※ 本当は呼び元側ですべき処理の気がするが、現状手ごろな場所が無いので
+            string decodeTitle = HttpUtility.HtmlDecode(title);
+
+            // fileスキームの場合、記事名からファイルに使えない文字をエスケープ
+            // ※ 仕組み的な処理はWebsite側に置きたいが、向こうではタイトルだけを抽出できないので
+            string escapeTitle = decodeTitle;
+            if (new Uri(this.Location).Scheme == "file")
+            {
+                escapeTitle = FormUtils.ReplaceInvalidFileNameChars(title);
+            }
+
+            // ページのXMLデータをMediaWikiサーバーから取得
+            XmlDocument xml = new XmlDocument();
+            using (Stream reader = this.GetStream(
+                new Uri(new Uri(this.Location), String.Format(this.ExportPath, escapeTitle))))
+            {
+                xml.Load(reader);
+            }
+
+            // ルートエレメントまで取得し、フォーマットをチェック
+            XmlElement rootElement = xml["mediawiki"];
+            if (rootElement == null)
+            {
+                // XMLは取得できたが空 or フォーマットが想定外
+                throw new InvalidDataException("parse failed");
+            }
+
+            // ページの解析
+            XmlElement pageElement = rootElement["page"];
+            if (pageElement == null)
+            {
+                // ページ無し
+                throw new FileNotFoundException("page not found");
+            }
+
+            // ページ名、ページ本文、最終更新日時
+            // ※ 一応、各項目が無くても動作するようにする
+            string pageTitle = XmlUtils.InnerText(pageElement["title"], title);
+            string text = null;
+            DateTime? time = null;
+            XmlElement revisionElement = pageElement["revision"];
+            if (revisionElement != null)
+            {
+                text = XmlUtils.InnerText(revisionElement["text"], null);
+                XmlElement timeElement = revisionElement["timestamp"];
+                if (timeElement != null)
+                {
+                    time = new DateTime?(DateTime.Parse(timeElement.InnerText));
+                }
+            }
+
+            // ページ情報を作成して返す
+            return new MediaWikiPage(this, pageTitle, text, time);
+        }
+
+        /// <summary>
+        /// 指定された文字列がWikipediaのシステム変数に相当かを判定。
+        /// </summary>
+        /// <param name="text">チェックする文字列。</param>
+        /// <returns><c>true</c> システム変数に相当。</returns>
+        public bool IsMagicWord(string text)
+        {
+            string s = text != null ? text : String.Empty;
+
+            // {{CURRENTYEAR}}や{{ns:1}}みたいなパターンがある
+            foreach (string variable in this.MagicWords)
+            {
+                if (s == variable || s.StartsWith(variable + ":"))
+                {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+        
+        #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.DocumentElement;
+            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;
+            }
+
+            this.NamespacePath = XmlUtils.InnerText(siteElement.SelectSingleNode("NamespacePath"));
+            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))
+            {
+                this.TemplateNamespace = int.Parse(text);
+            }
+
+            text = XmlUtils.InnerText(siteElement.SelectSingleNode("CategoryNamespace"));
+            if (!String.IsNullOrEmpty(text))
+            {
+                this.CategoryNamespace = int.Parse(text);
+            }
+
+            text = XmlUtils.InnerText(siteElement.SelectSingleNode("FileNamespace"));
+            if (!String.IsNullOrEmpty(text))
+            {
+                this.FileNamespace = int.Parse(text);
+            }
+
+            // システム定義変数
+            IList<string> variables = new List<string>();
+            foreach (XmlNode variableNode in siteElement.SelectNodes("MagicWords/Variable"))
+            {
+                variables.Add(variableNode.InnerText);
+            }
+
+            if (variables.Count > 0)
+            {
+                // 初期値の都合上、値がある場合のみ
+                this.MagicWords = variables;
+            }
+
+            // Template:Documentationの設定
+            XmlElement docElement = siteElement.SelectSingleNode("DocumentationTemplate") as XmlElement;
+            if (docElement != null)
+            {
+                this.DocumentationTemplate = docElement.InnerText;
+                this.DocumentationTemplateDefaultPage = docElement.GetAttribute("DefaultPage");
+            }
+        }
+
+        /// <summary>
+        /// オブジェクトをXMLにシリアライズする。
+        /// </summary>
+        /// <param name="writer">シリアライズ先のXmlWriter</param>
+        public void WriteXml(XmlWriter writer)
+        {
+            writer.WriteElementString("Location", this.Location);
+            new XmlSerializer(this.Language.GetType()).Serialize(writer, this.Language);
+
+            // MediaWiki固有の情報
+            // ※ 設定ファイルに初期値を持つものは、プロパティではなく値から出力
+            writer.WriteElementString("NamespacePath", this.namespacePath);
+            writer.WriteElementString("ExportPath", this.exportPath);
+            writer.WriteElementString("Redirect", this.redirect);
+            writer.WriteElementString(
+                "TemplateNamespace",
+                this.templateNamespace.HasValue ? this.templateNamespace.ToString() : String.Empty);
+            writer.WriteElementString(
+                "CategoryNamespace",
+                this.templateNamespace.HasValue ? this.categoryNamespace.ToString() : String.Empty);
+            writer.WriteElementString(
+                "FileNamespace",
+                this.templateNamespace.HasValue ? this.fileNamespace.ToString() : String.Empty);
+
+            // システム定義変数
+            writer.WriteStartElement("MagicWords");
+            if (this.magicWords != null)
+            {
+                foreach (string variable in this.magicWords)
+                {
+                    writer.WriteElementString("Variable", variable);
+                }
+            }
+
+            writer.WriteEndElement();
+
+            // Template:Documentationの設定は一項目で出力
+            if (!String.IsNullOrEmpty(this.DocumentationTemplate))
+            {
+                writer.WriteStartElement("DocumentationTemplate");
+                writer.WriteAttributeString("DefaultPage", this.DocumentationTemplateDefaultPage);
+                writer.WriteValue(this.DocumentationTemplate);
+                writer.WriteEndElement();
+            }
+        }
+
+        #endregion
+    }
+}
index 438e6e0..daa8c7d 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      MediaWikiのページをあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="MediaWikiPage.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Linq;\r
-    using System.Text;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// MediaWikiのページをあらわすモデルクラスです。\r
-    /// </summary>\r
-    public class MediaWikiPage : Page\r
-    {\r
-        #region 定数宣言\r
-\r
-        /// <summary>\r
-        /// nowikiタグ。\r
-        /// </summary>\r
-        public static readonly string NowikiTag = "nowiki";\r
-\r
-        /// <summary>\r
-        /// msgnwの書式。\r
-        /// </summary>\r
-        public static readonly string Msgnw = "msgnw:";\r
-\r
-        #endregion\r
-\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// リダイレクト先のページ名。\r
-        /// </summary>\r
-        private Link redirect;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="text">ページの本文。</param>\r
-        /// <param name="timestamp">ページのタイムスタンプ。</param>\r
-        public MediaWikiPage(MediaWiki website, string title, string text, DateTime? timestamp)\r
-            : base(website, title, text, timestamp)\r
-        {\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// ページのタイムスタンプには<c>null</c>を設定。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="text">ページの本文。</param>\r
-        public MediaWikiPage(MediaWiki website, string title, string text)\r
-            : base(website, title, text)\r
-        {\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// ページの本文, タイムスタンプには<c>null</c>を設定。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        public MediaWikiPage(MediaWiki website, string title)\r
-            : base(website, title)\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// ページが所属するウェブサイト。\r
-        /// </summary>\r
-        public new MediaWiki Website\r
-        {\r
-            get\r
-            {\r
-                return base.Website as MediaWiki;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                base.Website = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページの本文。\r
-        /// </summary>\r
-        public override string Text\r
-        {\r
-            get\r
-            {\r
-                return base.Text;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                // 本文は普通に格納\r
-                base.Text = value;\r
-\r
-                // 本文格納のタイミングでリダイレクトページ(#REDIRECT等)かを判定\r
-                if (!String.IsNullOrEmpty(base.Text))\r
-                {\r
-                    this.TryParseRedirect();\r
-                }\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// リダイレクト先へのリンク。\r
-        /// </summary>\r
-        public Link Redirect\r
-        {\r
-            get\r
-            {\r
-                // Textが設定されている場合のみ有効\r
-                this.ValidateIncomplete();\r
-                return this.redirect;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                this.redirect = value;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開静的メソッド\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストがnowikiブロックかを解析する。\r
-        /// </summary>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="nowiki">解析したnowikiブロック。</param>\r
-        /// <returns>nowikiブロックの場合<c>true</c>。</returns>\r
-        /// <remarks>\r
-        /// nowikiブロックと判定するには、1文字目が開始タグである必要がある。\r
-        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。\r
-        /// また、入れ子は考慮しない。\r
-        /// </remarks>\r
-        public static bool TryParseNowiki(string text, out string nowiki)\r
-        {\r
-            nowiki = null;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            LazyXmlParser.SimpleElement element;\r
-            if (parser.TryParse(text, out element))\r
-            {\r
-                if (element.Name.ToLower() == MediaWikiPage.NowikiTag)\r
-                {\r
-                    nowiki = element.OuterXml;\r
-                    return true;\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開インスタンスメソッド\r
-\r
-        /// <summary>\r
-        /// 指定された言語コードへの言語間リンクを返す。\r
-        /// </summary>\r
-        /// <param name="code">言語コード。</param>\r
-        /// <returns>言語間リンク先の記事名。見つからない場合は空。</returns>\r
-        /// <remarks>言語間リンクが複数存在する場合は、先に発見したものを返す。</remarks>\r
-        public string GetInterWiki(string code)\r
-        {\r
-            // Textが設定されている場合のみ有効\r
-            this.ValidateIncomplete();\r
-\r
-            // 記事に存在する指定言語への言語間リンクを取得\r
-            for (int i = 0; i < this.Text.Length; i++)\r
-            {\r
-                char c = this.Text[i];\r
-                Link link;\r
-                switch (c)\r
-                {\r
-                    case '<':\r
-                        // コメント(<!--)またはnowiki区間の場合飛ばす\r
-                        string subtext = this.Text.Substring(i);\r
-                        string value;\r
-                        if (LazyXmlParser.TryParseComment(subtext, out value))\r
-                        {\r
-                            i += value.Length - 1;\r
-                        }\r
-                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))\r
-                        {\r
-                            i += value.Length - 1;\r
-                        }\r
-\r
-                        break;\r
-\r
-                    case '{':\r
-                        // テンプレート\r
-                        if (this.TryParseTemplate(this.Text.Substring(i), out link))\r
-                        {\r
-                            i += link.OriginalText.Length - 1;\r
-\r
-                            // Documentationテンプレートがある場合は、その中を探索\r
-                            string interWiki = this.GetDocumentationInterWiki(link, code);\r
-                            if (!String.IsNullOrEmpty(interWiki))\r
-                            {\r
-                                return interWiki;\r
-                            }\r
-                        }\r
-\r
-                        break;\r
-\r
-                    case '[':\r
-                        // リンク\r
-                        if (this.TryParseLink(this.Text.Substring(i), out link))\r
-                        {\r
-                            i += link.OriginalText.Length - 1;\r
-\r
-                            // 指定言語への言語間リンクの場合、内容を取得し、処理終了\r
-                            if (link.Code == code && !link.IsColon)\r
-                            {\r
-                                return link.Title;\r
-                            }\r
-                        }\r
-\r
-                        break;\r
-                }\r
-            }\r
-\r
-            // 未発見の場合、空文字列\r
-            return String.Empty;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページがリダイレクトかをチェック。\r
-        /// </summary>\r
-        /// <returns><c>true</c> リダイレクト。</returns>\r
-        public bool IsRedirect()\r
-        {\r
-            // Textが設定されている場合のみ有効\r
-            return this.Redirect != null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページがテンプレートかをチェック。\r
-        /// </summary>\r
-        /// <returns><c>true</c> テンプレート。</returns>\r
-        public bool IsTemplate()\r
-        {\r
-            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック\r
-            return this.IsNamespacePage(this.Website.TemplateNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページがカテゴリーかをチェック。\r
-        /// </summary>\r
-        /// <returns><c>true</c> カテゴリー。</returns>\r
-        public bool IsCategory()\r
-        {\r
-            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック\r
-            return this.IsNamespacePage(this.Website.CategoryNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページが画像かをチェック。\r
-        /// </summary>\r
-        /// <returns><c>true</c> 画像。</returns>\r
-        public bool IsFile()\r
-        {\r
-            // 指定されたページ名がファイル(Image:等で始まる)かをチェック\r
-            return this.IsNamespacePage(this.Website.FileNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページが標準名前空間かをチェック。\r
-        /// </summary>\r
-        /// <returns><c>true</c> 標準名前空間。</returns>\r
-        public bool IsMain()\r
-        {\r
-            // 指定されたページ名が標準名前空間以外の名前空間(Wikipedia:等で始まる)かをチェック\r
-            string title = this.Title.ToLower();\r
-            foreach (IList<string> prefixes in this.Website.Namespaces.Values)\r
-            {\r
-                foreach (string prefix in prefixes)\r
-                {\r
-                    if (title.StartsWith(prefix.ToLower() + ":"))\r
-                    {\r
-                        return false;\r
-                    }\r
-                }\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        #region Linkクラスに移動したいメソッド\r
-\r
-        // TODO: 以下の各メソッドのうち、リンクに関するものはLinkクラスに移したい。\r
-        //       また、余計な依存関係を持っているものを整理したい。\r
-\r
-        /// <summary>\r
-        /// 渡されたWikipediaの内部リンクを解析。\r
-        /// </summary>\r
-        /// <param name="text">[[で始まる文字列。</param>\r
-        /// <param name="link">解析したリンク。</param>\r
-        /// <returns>解析に成功した場合<c>true</c>。</returns>\r
-        public bool TryParseLink(string text, out Link link)\r
-        {\r
-            // 出力値初期化\r
-            link = null;\r
-\r
-            // 入力値確認\r
-            if (!text.StartsWith("[["))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 構文を解析して、[[]]内部の文字列を取得\r
-            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・\r
-            string article = String.Empty;\r
-            string section = String.Empty;\r
-            IList<string> pipeTexts = new List<string>();\r
-            int lastIndex = -1;\r
-            int pipeCounter = 0;\r
-            bool sharpFlag = false;\r
-            for (int i = 2; i < text.Length; i++)\r
-            {\r
-                char c = text[i];\r
-\r
-                // ]]が見つかったら、処理正常終了\r
-                if (StringUtils.StartsWith(text, "]]", i))\r
-                {\r
-                    lastIndex = ++i;\r
-                    break;\r
-                }\r
-\r
-                // | が含まれている場合、以降の文字列は表示名などとして扱う\r
-                if (c == '|')\r
-                {\r
-                    ++pipeCounter;\r
-                    pipeTexts.Add(String.Empty);\r
-                    continue;\r
-                }\r
-\r
-                // 変数([[{{{1}}}]]とか)の再帰チェック\r
-                string dummy;\r
-                string variable;\r
-                int index = this.ChkVariable(out variable, out dummy, text, i);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-                    if (pipeCounter > 0)\r
-                    {\r
-                        pipeTexts[pipeCounter - 1] += variable;\r
-                    }\r
-                    else if (sharpFlag)\r
-                    {\r
-                        section += variable;\r
-                    }\r
-                    else\r
-                    {\r
-                        article += variable;\r
-                    }\r
-\r
-                    continue;\r
-                }\r
-\r
-                // | の前のとき\r
-                if (pipeCounter <= 0)\r
-                {\r
-                    // 変数以外で { } または < > [ ] \n が含まれている場合、リンクは無効\r
-                    if ((c == '<') || (c == '>') || (c == '[') || (c == ']') || (c == '{') || (c == '}') || (c == '\n'))\r
-                    {\r
-                        break;\r
-                    }\r
-\r
-                    // # の前のとき\r
-                    if (!sharpFlag)\r
-                    {\r
-                        // #が含まれている場合、以降の文字列は見出しへのリンクとして扱う(1つめの#のみ有効)\r
-                        if (c == '#')\r
-                        {\r
-                            sharpFlag = true;\r
-                        }\r
-                        else\r
-                        {\r
-                            article += c;\r
-                        }\r
-                    }\r
-                    else\r
-                    {\r
-                        // # の後のとき\r
-                        section += c;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    // | の後のとき\r
-                    if (c == '<')\r
-                    {\r
-                        string subtext = text.Substring(i);\r
-                        string value;\r
-                        if (LazyXmlParser.TryParseComment(subtext, out value))\r
-                        {\r
-                            // コメント(<!--)が含まれている場合、リンクは無効\r
-                            break;\r
-                        }\r
-                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))\r
-                        {\r
-                            // nowikiブロック\r
-                            i += value.Length - 1;\r
-                            pipeTexts[pipeCounter - 1] += value;\r
-                            continue;\r
-                        }\r
-                    }\r
-\r
-                    // リンク [[ {{ ([[image:xx|[[test]]の画像]]とか)の再帰チェック\r
-                    Link l;\r
-                    index = this.ChkLinkText(out l, text, i);\r
-                    if (index != -1)\r
-                    {\r
-                        i = index;\r
-                        pipeTexts[pipeCounter - 1] += l.OriginalText;\r
-                        continue;\r
-                    }\r
-\r
-                    pipeTexts[pipeCounter - 1] += c;\r
-                }\r
-            }\r
-\r
-            // 解析失敗\r
-            if (lastIndex < 0)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 解析に成功した場合、結果を出力値に設定\r
-            link = new Link();\r
-\r
-            // 変数ブロックの文字列をリンクのテキストに設定\r
-            link.OriginalText = text.Substring(0, lastIndex + 1);\r
-\r
-            // 前後のスペースは削除(見出しは後ろのみ)\r
-            link.Title = article.Trim();\r
-            link.Section = section.TrimEnd();\r
-\r
-            // | 以降はそのまま設定\r
-            link.PipeTexts = pipeTexts;\r
-\r
-            // 記事名から情報を抽出\r
-            // サブページ\r
-            if (link.Title.StartsWith("/"))\r
-            {\r
-                link.IsSubpage = true;\r
-            }\r
-            else if (link.Title.StartsWith(":"))\r
-            {\r
-                // 先頭が :\r
-                link.IsColon = true;\r
-                link.Title = link.Title.TrimStart(':').TrimStart();\r
-            }\r
-\r
-            // 標準名前空間以外で[[xxx:yyy]]のようになっている場合、言語コード\r
-            if (link.Title.Contains(":") && new MediaWikiPage(this.Website, link.Title).IsMain())\r
-            {\r
-                // ※本当は、言語コード等の一覧を作り、其処と一致するものを・・・とすべきだろうが、\r
-                //   メンテしきれないので : を含む名前空間以外を全て言語コード等と判定\r
-                link.Code = link.Title.Substring(0, link.Title.IndexOf(':')).TrimEnd();\r
-                link.Title = link.Title.Substring(link.Title.IndexOf(':') + 1).TrimStart();\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたWikipediaのテンプレートを解析。\r
-        /// </summary>\r
-        /// <param name="text">{{で始まる文字列。</param>\r
-        /// <param name="link">解析したテンプレートのリンク。</param>\r
-        /// <returns>解析に成功した場合<c>true</c>。</returns>\r
-        public bool TryParseTemplate(string text, out Link link)\r
-        {\r
-            // 出力値初期化\r
-            link = null;\r
-\r
-            // 入力値確認\r
-            if (!text.StartsWith("{{"))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 構文を解析して、{{}}内部の文字列を取得\r
-            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・\r
-            string article = String.Empty;\r
-            IList<string> pipeTexts = new List<string>();\r
-            int lastIndex = -1;\r
-            int pipeCounter = 0;\r
-            for (int i = 2; i < text.Length; i++)\r
-            {\r
-                char c = text[i];\r
-\r
-                // }}が見つかったら、処理正常終了\r
-                if (StringUtils.StartsWith(text, "}}", i))\r
-                {\r
-                    lastIndex = ++i;\r
-                    break;\r
-                }\r
-\r
-                // | が含まれている場合、以降の文字列は引数などとして扱う\r
-                if (c == '|')\r
-                {\r
-                    ++pipeCounter;\r
-                    pipeTexts.Add(String.Empty);\r
-                    continue;\r
-                }\r
-\r
-                // 変数([[{{{1}}}]]とか)の再帰チェック\r
-                string dummy;\r
-                string variable;\r
-                int index = this.ChkVariable(out variable, out dummy, text, i);\r
-                if (index != -1)\r
-                {\r
-                    i = index;\r
-                    if (pipeCounter > 0)\r
-                    {\r
-                        pipeTexts[pipeCounter - 1] += variable;\r
-                    }\r
-                    else\r
-                    {\r
-                        article += variable;\r
-                    }\r
-\r
-                    continue;\r
-                }\r
-\r
-                // | の前のとき\r
-                if (pipeCounter <= 0)\r
-                {\r
-                    // 変数以外で < > [ ] { } が含まれている場合、リンクは無効\r
-                    if ((c == '<') || (c == '>') || (c == '[') || (c == ']') || (c == '{') || (c == '}'))\r
-                    {\r
-                        break;\r
-                    }\r
-\r
-                    article += c;\r
-                }\r
-                else\r
-                {\r
-                    // | の後のとき\r
-                    if (c == '<')\r
-                    {\r
-                        string subtext = text.Substring(i);\r
-                        string value;\r
-                        if (LazyXmlParser.TryParseComment(subtext, out value))\r
-                        {\r
-                            // コメント(<!--)が含まれている場合、リンクは無効\r
-                            break;\r
-                        }\r
-                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))\r
-                        {\r
-                            // nowikiブロック\r
-                            i += value.Length - 1;\r
-                            pipeTexts[pipeCounter - 1] += value;\r
-                            continue;\r
-                        }\r
-                    }\r
-\r
-                    // リンク [[ {{ ({{test|[[例]]}}とか)の再帰チェック\r
-                    Link l;\r
-                    index = this.ChkLinkText(out l, text, i);\r
-                    if (index != -1)\r
-                    {\r
-                        i = index;\r
-                        pipeTexts[pipeCounter - 1] += l.OriginalText;\r
-                        continue;\r
-                    }\r
-\r
-                    pipeTexts[pipeCounter - 1] += c;\r
-                }\r
-            }\r
-\r
-            // 解析失敗\r
-            if (lastIndex < 0)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 解析に成功した場合、結果を出力値に設定\r
-            link = new Link();\r
-            link.IsTemplateTag = true;\r
-\r
-            // 変数ブロックの文字列をリンクのテキストに設定\r
-            link.OriginalText = text.Substring(0, lastIndex + 1);\r
-\r
-            // 前後のスペース・改行は削除(見出しは後ろのみ)\r
-            link.Title = article.Trim();\r
-\r
-            // | 以降はそのまま設定\r
-            link.PipeTexts = pipeTexts;\r
-\r
-            // 記事名から情報を抽出\r
-            // サブページ\r
-            if (link.Title.StartsWith("/") == true)\r
-            {\r
-                link.IsSubpage = true;\r
-            }\r
-            else if (link.Title.StartsWith(":"))\r
-            {\r
-                // 先頭が :\r
-                link.IsColon = true;\r
-                link.Title = link.Title.TrimStart(':').TrimStart();\r
-            }\r
-\r
-            // 先頭が msgnw:\r
-            link.IsMsgnw = link.Title.ToLower().StartsWith(Msgnw.ToLower());\r
-            if (link.IsMsgnw)\r
-            {\r
-                link.Title = link.Title.Substring(Msgnw.Length);\r
-            }\r
-\r
-            // 記事名直後の改行の有無\r
-            if (article.TrimEnd(' ').EndsWith("\n"))\r
-            {\r
-                link.Enter = true;\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストの指定された位置に存在するWikipediaの内部リンク・テンプレートをチェック。\r
-        /// </summary>\r
-        /// <param name="link">解析したリンク。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <returns>正常時の戻り値には、]]の後ろの]の位置のインデックスを返す。異常時は-1。</returns>\r
-        public int ChkLinkText(out Link link, string text, int index)\r
-        {\r
-            // 入力値に応じて、処理を振り分け\r
-            if (StringUtils.StartsWith(text, "[[", index))\r
-            {\r
-                // 内部リンク\r
-                if (this.TryParseLink(text.Substring(index), out link))\r
-                {\r
-                    return index + link.OriginalText.Length - 1;\r
-                }\r
-            }\r
-            else if (StringUtils.StartsWith(text, "{{", index))\r
-            {\r
-                // テンプレート\r
-                if (this.TryParseTemplate(text.Substring(index), out link))\r
-                {\r
-                    return index + link.OriginalText.Length - 1;\r
-                }\r
-            }\r
-\r
-            // 出力値初期化。リンク以外の場合、nullを返す\r
-            link = null;\r
-            return -1;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストの指定された位置に存在する変数を解析。\r
-        /// </summary>\r
-        /// <param name="variable">解析した変数。</param>\r
-        /// <param name="value">変数のパラメータ値。</param>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="index">解析開始インデックス。</param>\r
-        /// <returns>正常時の戻り値には、変数の終了位置のインデックスを返す。異常時は-1。</returns>\r
-        public int ChkVariable(out string variable, out string value, string text, int index)\r
-        {\r
-            // 出力値初期化\r
-            int lastIndex = -1;\r
-            variable = String.Empty;\r
-            value = String.Empty;\r
-\r
-            // 入力値確認\r
-            if (!StringUtils.StartsWith(text, "{{{", index))\r
-            {\r
-                return lastIndex;\r
-            }\r
-\r
-            // ブロック終了まで取得\r
-            bool pipeFlag = false;\r
-            for (int i = index + 3; i < text.Length; i++)\r
-            {\r
-                // 終了条件のチェック\r
-                if (StringUtils.StartsWith(text, "}}}", i))\r
-                {\r
-                    lastIndex = i + 2;\r
-                    break;\r
-                }\r
-\r
-                if (text[i] == '<')\r
-                {\r
-                    string comment;\r
-                    if (LazyXmlParser.TryParseComment(text.Substring(i), out comment))\r
-                    {\r
-                        // コメント(<!--)ブロック\r
-                        i += comment.Length - 1;\r
-                        continue;\r
-                    }\r
-                }\r
-\r
-                // | が含まれている場合、以降の文字列は代入された値として扱う\r
-                if (text[i] == '|')\r
-                {\r
-                    pipeFlag = true;\r
-                }\r
-                else if (!pipeFlag)\r
-                {\r
-                    // | の前のとき\r
-                    // ※Wikipediaの仕様上は、{{{1{|表示}}} のように変数名の欄に { を\r
-                    //   含めることができるようだが、判別しきれないので、エラーとする\r
-                    //   (どうせ意図してそんなことする人は居ないだろうし・・・)\r
-                    if (text[i] == '{')\r
-                    {\r
-                        break;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    // | の後のとき\r
-                    if (text[i] == '<')\r
-                    {\r
-                        string nowiki;\r
-                        if (MediaWikiPage.TryParseNowiki(text.Substring(i), out nowiki))\r
-                        {\r
-                            // nowikiブロック\r
-                            i += nowiki.Length - 1;\r
-                            value += nowiki;\r
-                            continue;\r
-                        }\r
-                    }\r
-\r
-                    // 変数({{{1|{{{2}}}}}}とか)の再帰チェック\r
-                    string var;\r
-                    string dummy;\r
-                    int subindex = this.ChkVariable(out var, out dummy, text, i);\r
-                    if (subindex != -1)\r
-                    {\r
-                        i = subindex;\r
-                        value += var;\r
-                        continue;\r
-                    }\r
-\r
-                    // リンク [[ {{ ({{{1|[[test]]}}}とか)の再帰チェック\r
-                    Link link;\r
-                    subindex = this.ChkLinkText(out link, text, i);\r
-                    if (subindex != -1)\r
-                    {\r
-                        i = subindex;\r
-                        value += link.OriginalText;\r
-                        continue;\r
-                    }\r
-\r
-                    value += text[i];\r
-                }\r
-            }\r
-\r
-            // 変数ブロックの文字列を出力値に設定\r
-            if (lastIndex != -1)\r
-            {\r
-                variable = text.Substring(index, lastIndex - index + 1);\r
-            }\r
-            else\r
-            {\r
-                // 正常な構文ではなかった場合、出力値をクリア\r
-                variable = String.Empty;\r
-                value = String.Empty;\r
-            }\r
-\r
-            return lastIndex;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部処理用インスタンスメソッド\r
-\r
-        /// <summary>\r
-        /// ページが指定された番号の名前空間に所属するかをチェック。\r
-        /// </summary>\r
-        /// <param name="id">名前空間のID。</param>\r
-        /// <returns><c>true</c> 所属する。</returns>\r
-        protected bool IsNamespacePage(int id)\r
-        {\r
-            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック\r
-            IList<string> prefixes = this.Website.Namespaces[id];\r
-            if (prefixes != null)\r
-            {\r
-                string title = this.Title.ToLower();\r
-                foreach (string prefix in prefixes)\r
-                {\r
-                    if (title.StartsWith(prefix.ToLower() + ":"))\r
-                    {\r
-                        return true;\r
-                    }\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。\r
-        /// 不完全な場合、例外をスローする。\r
-        /// </summary>\r
-        /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>\r
-        protected void ValidateIncomplete()\r
-        {\r
-            if (String.IsNullOrEmpty(this.Text))\r
-            {\r
-                // ページ本文が設定されていない場合不完全と判定\r
-                throw new InvalidOperationException("Text is unset");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 現在のページをリダイレクトとして解析する。\r
-        /// </summary>\r
-        /// <returns>リダイレクトの場合<c>true</c>。</returns>\r
-        /// <remarks>リダイレクトの場合、転送先ページ名をプロパティに格納。</remarks>\r
-        private bool TryParseRedirect()\r
-        {\r
-            // 日本語版みたいに、#REDIRECTと言語固有の#転送みたいなのがあると思われるので、\r
-            // 翻訳元言語とデフォルトの設定でチェック\r
-            this.Redirect = null;\r
-            for (int i = 0; i < 2; i++)\r
-            {\r
-                string format = this.Website.Redirect;\r
-                if (i == 1)\r
-                {\r
-                    format = Properties.Settings.Default.MediaWikiRedirect;\r
-                }\r
-\r
-                if (!String.IsNullOrEmpty(format)\r
-                    && this.Text.ToLower().StartsWith(format.ToLower()))\r
-                {\r
-                    Link link;\r
-                    if (this.TryParseLink(this.Text.Substring(format.Length).TrimStart(), out link))\r
-                    {\r
-                        this.Redirect = link;\r
-                        return true;\r
-                    }\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたTemplate:Documentationの呼び出しから、指定された言語コードへの言語間リンクを返す。\r
-        /// </summary>\r
-        /// <param name="link">テンプレート呼び出しのリンク。</param>\r
-        /// <param name="code">言語コード。</param>\r
-        /// <returns>言語間リンク先の記事名。見つからない場合またはパラメータが対象外の場合は空。</returns>\r
-        /// <remarks>言語間リンクが複数存在する場合は、先に発見したものを返す。</remarks>\r
-        private string GetDocumentationInterWiki(Link link, string code)\r
-        {\r
-            // テンプレートタグか、この言語にTemplate:Documentationの設定がされているかを確認\r
-            string docTitle = this.Website.DocumentationTemplate;\r
-            if (!link.IsTemplateTag || String.IsNullOrEmpty(docTitle))\r
-            {\r
-                return String.Empty;\r
-            }\r
-\r
-            // Documentationテンプレートのリンクかを確認\r
-            if (link.Title.ToLower() != docTitle.ToLower())\r
-            {\r
-                // 名前空間で一致していない可能性があるので、名前空間を取ってもう一度判定\r
-                int index = docTitle.IndexOf(':');\r
-                if (new MediaWikiPage(this.Website, docTitle).IsTemplate()\r
-                    && index >= 0 && index + 1 < docTitle.Length)\r
-                {\r
-                    docTitle = docTitle.Substring(docTitle.IndexOf(':') + 1);\r
-                }\r
-\r
-                if (link.Title.ToLower() != docTitle.ToLower())\r
-                {\r
-                    // どちらでも一致しない場合は別のテンプレートなりなので無視\r
-                    return String.Empty;\r
-                }\r
-            }\r
-\r
-            // 解説記事名を確認\r
-            string subtitle = link.PipeTexts.ElementAtOrDefault(0);\r
-            if (String.IsNullOrWhiteSpace(subtitle) || subtitle.Contains('='))\r
-            {\r
-                // 指定されていない場合はデフォルトのページを探索\r
-                subtitle = this.Website.DocumentationTemplateDefaultPage;\r
-            }\r
-\r
-            if (String.IsNullOrEmpty(subtitle))\r
-            {\r
-                return String.Empty;\r
-            }\r
-\r
-            // サブページの場合、親ページのページ名を付加\r
-            // TODO: サブページの仕組みについては要再検討\r
-            if (subtitle.StartsWith("/"))\r
-            {\r
-                subtitle = this.Title + subtitle;\r
-            }\r
-\r
-            // 解説ページから言語間リンクを取得\r
-            MediaWikiPage subpage = null;\r
-            try\r
-            {\r
-                // ※ 本当はここでの取得状況も画面に見せたいが、今のつくりで\r
-                //    そうするとややこしくなるので隠蔽する。\r
-                subpage = this.Website.GetPage(subtitle) as MediaWikiPage;\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                System.Diagnostics.Debug.WriteLine(ex.StackTrace);\r
-            }\r
-\r
-            if (subpage != null)\r
-            {\r
-                string interWiki = subpage.GetInterWiki(code);\r
-                if (!String.IsNullOrEmpty(interWiki))\r
-                {\r
-                    return interWiki;\r
-                }\r
-            }\r
-\r
-            // 未発見の場合、空文字列\r
-            return String.Empty;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部クラス\r
-\r
-        /// <summary>\r
-        /// Wikipediaのリンクの要素を格納するための構造体。\r
-        /// </summary>\r
-        public class Link\r
-        {\r
-            #region プロパティ\r
-\r
-            /// <summary>\r
-            /// リンクのオブジェクト作成時の元テキスト([[~]])。\r
-            /// </summary>\r
-            public string OriginalText\r
-            {\r
-                get;\r
-                //// TODO: このクラスにParseを移動完了したら、protectedにする\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// リンクの記事名。\r
-            /// </summary>\r
-            /// <remarks>リンクに記載されていた記事名であり、名前空間の情報などは含まない可能性があるため注意。</remarks>\r
-            public string Title\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// リンクのセクション名(#)。\r
-            /// </summary>\r
-            public string Section\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// リンクのパイプ後の文字列(|)。\r
-            /// </summary>\r
-            public IList<string> PipeTexts\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// 言語間または他プロジェクトへのリンクの場合、コード。\r
-            /// </summary>\r
-            public string Code\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// テンプレートタグで書かれたリンク({{~}})か?\r
-            /// </summary>\r
-            /// <remarks>\r
-            /// 必ずしもリンク先がテンプレートであることを意味しない。\r
-            /// 普通のページをこの書式でテンプレートのように使用することも可能である。\r
-            /// </remarks>\r
-            public bool IsTemplateTag\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// 記事名の先頭がサブページを示す / で始まるか?\r
-            /// </summary>\r
-            /// <remarks>※ 2010年9月現在、この処理には不足あり。</remarks>\r
-            public bool IsSubpage\r
-            {\r
-                // TODO: サブページには相対パスで[[../~]]や[[../../~]]というような書き方もある模様。\r
-                //       この辺りの処理は[[Help:サブページ]]を元に全面的に見直す必要あり\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// リンクの先頭が : で始まるかを示すフラグ。\r
-            /// </summary>\r
-            public bool IsColon\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// テンプレートの場合に、テンプレートのソースをそのまま出力することを示す msgnw: が付加されているか?\r
-            /// </summary>\r
-            public bool IsMsgnw\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// テンプレートの場合に、記事名の後で改行が入るか?\r
-            /// </summary>\r
-            public bool Enter\r
-            {\r
-                get;\r
-                set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// リンクが表すテキスト([[~]])。\r
-            /// </summary>\r
-            public string Text\r
-            {\r
-                get\r
-                {\r
-                    // 戻り値初期化\r
-                    StringBuilder b = new StringBuilder();\r
-\r
-                    // 枠の設定\r
-                    string startSign = "[[";\r
-                    string endSign = "]]";\r
-                    if (this.IsTemplateTag)\r
-                    {\r
-                        startSign = "{{";\r
-                        endSign = "}}";\r
-                    }\r
-\r
-                    // 先頭の枠の付加\r
-                    b.Append(startSign);\r
-\r
-                    // 先頭の : の付加\r
-                    if (this.IsColon)\r
-                    {\r
-                        b.Append(':');\r
-                    }\r
-\r
-                    // msgnw: (テンプレートを<nowiki>タグで挟む)の付加\r
-                    if (this.IsTemplateTag && this.IsMsgnw)\r
-                    {\r
-                        b.Append(MediaWikiPage.Msgnw);\r
-                    }\r
-\r
-                    // 言語コード・他プロジェクトコードの付加\r
-                    if (!String.IsNullOrEmpty(this.Code))\r
-                    {\r
-                        b.Append(this.Code);\r
-                    }\r
-\r
-                    // リンクの付加\r
-                    if (!String.IsNullOrEmpty(this.Title))\r
-                    {\r
-                        b.Append(this.Title);\r
-                    }\r
-\r
-                    // セクション名の付加\r
-                    if (!String.IsNullOrEmpty(this.Section))\r
-                    {\r
-                        b.Append('#');\r
-                        b.Append(this.Section);\r
-                    }\r
-\r
-                    // 改行の付加\r
-                    if (this.Enter)\r
-                    {\r
-                        b.Append('\n');\r
-                    }\r
-\r
-                    // パイプ後の文字列の付加\r
-                    if (this.PipeTexts != null)\r
-                    {\r
-                        foreach (string s in this.PipeTexts)\r
-                        {\r
-                            b.Append('|');\r
-                            if (!String.IsNullOrEmpty(s))\r
-                            {\r
-                                b.Append(s);\r
-                            }\r
-                        }\r
-                    }\r
-\r
-                    // 終わりの枠の付加\r
-                    b.Append(endSign);\r
-                    return b.ToString();\r
-                }\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region 公開メソッド\r
-\r
-            /// <summary>\r
-            /// このオブジェクトを表すリンク文字列を返す。\r
-            /// </summary>\r
-            /// <returns>オブジェクトを表すリンク文字列。</returns>\r
-            public override string ToString()\r
-            {\r
-                // リンクを表すテキスト、ならびに元テキストを返す\r
-                return this.Text + "<!-- " + this.OriginalText + " -->";\r
-            }\r
-\r
-            #endregion\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      MediaWikiのページをあらわすモデルクラスソース</summary>
+//
+// <copyright file="MediaWikiPage.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using System.Text;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// MediaWikiのページをあらわすモデルクラスです。
+    /// </summary>
+    public class MediaWikiPage : Page
+    {
+        #region 定数宣言
+
+        /// <summary>
+        /// nowikiタグ。
+        /// </summary>
+        public static readonly string NowikiTag = "nowiki";
+
+        /// <summary>
+        /// msgnwの書式。
+        /// </summary>
+        public static readonly string Msgnw = "msgnw:";
+
+        #endregion
+
+        #region private変数
+
+        /// <summary>
+        /// リダイレクト先のページ名。
+        /// </summary>
+        private Link redirect;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ。
+        /// </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)
+        {
+        }
+
+        /// <summary>
+        /// コンストラクタ。
+        /// ページのタイムスタンプには<c>null</c>を設定。
+        /// </summary>
+        /// <param name="website">ページが所属するウェブサイト。</param>
+        /// <param name="title">ページタイトル。</param>
+        /// <param name="text">ページの本文。</param>
+        public MediaWikiPage(MediaWiki website, string title, string text)
+            : base(website, title, text)
+        {
+        }
+
+        /// <summary>
+        /// コンストラクタ。
+        /// ページの本文, タイムスタンプには<c>null</c>を設定。
+        /// </summary>
+        /// <param name="website">ページが所属するウェブサイト。</param>
+        /// <param name="title">ページタイトル。</param>
+        public MediaWikiPage(MediaWiki website, string title)
+            : base(website, title)
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// ページが所属するウェブサイト。
+        /// </summary>
+        public new MediaWiki Website
+        {
+            get
+            {
+                return base.Website as MediaWiki;
+            }
+
+            protected set
+            {
+                base.Website = value;
+            }
+        }
+
+        /// <summary>
+        /// ページの本文。
+        /// </summary>
+        public override string Text
+        {
+            get
+            {
+                return base.Text;
+            }
+
+            protected set
+            {
+                // 本文は普通に格納
+                base.Text = value;
+
+                // 本文格納のタイミングでリダイレクトページ(#REDIRECT等)かを判定
+                if (!String.IsNullOrEmpty(base.Text))
+                {
+                    this.TryParseRedirect();
+                }
+            }
+        }
+
+        /// <summary>
+        /// リダイレクト先へのリンク。
+        /// </summary>
+        public Link Redirect
+        {
+            get
+            {
+                // Textが設定されている場合のみ有効
+                this.ValidateIncomplete();
+                return this.redirect;
+            }
+
+            protected set
+            {
+                this.redirect = value;
+            }
+        }
+
+        #endregion
+
+        #region 公開静的メソッド
+
+        /// <summary>
+        /// 渡されたテキストがnowikiブロックかを解析する。
+        /// </summary>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="nowiki">解析したnowikiブロック。</param>
+        /// <returns>nowikiブロックの場合<c>true</c>。</returns>
+        /// <remarks>
+        /// nowikiブロックと判定するには、1文字目が開始タグである必要がある。
+        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。
+        /// また、入れ子は考慮しない。
+        /// </remarks>
+        public static bool TryParseNowiki(string text, out string nowiki)
+        {
+            nowiki = null;
+            LazyXmlParser parser = new LazyXmlParser();
+            LazyXmlParser.SimpleElement element;
+            if (parser.TryParse(text, out element))
+            {
+                if (element.Name.ToLower() == MediaWikiPage.NowikiTag)
+                {
+                    nowiki = element.OuterXml;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        #endregion
+
+        #region 公開インスタンスメソッド
+
+        /// <summary>
+        /// 指定された言語コードへの言語間リンクを返す。
+        /// </summary>
+        /// <param name="code">言語コード。</param>
+        /// <returns>言語間リンク先の記事名。見つからない場合は空。</returns>
+        /// <remarks>言語間リンクが複数存在する場合は、先に発見したものを返す。</remarks>
+        public string GetInterWiki(string code)
+        {
+            // Textが設定されている場合のみ有効
+            this.ValidateIncomplete();
+
+            // 記事に存在する指定言語への言語間リンクを取得
+            for (int i = 0; i < this.Text.Length; i++)
+            {
+                char c = this.Text[i];
+                Link link;
+                switch (c)
+                {
+                    case '<':
+                        // コメント(<!--)またはnowiki区間の場合飛ばす
+                        string subtext = this.Text.Substring(i);
+                        string value;
+                        if (LazyXmlParser.TryParseComment(subtext, out value))
+                        {
+                            i += value.Length - 1;
+                        }
+                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))
+                        {
+                            i += value.Length - 1;
+                        }
+
+                        break;
+
+                    case '{':
+                        // テンプレート
+                        if (this.TryParseTemplate(this.Text.Substring(i), out link))
+                        {
+                            i += link.OriginalText.Length - 1;
+
+                            // Documentationテンプレートがある場合は、その中を探索
+                            string interWiki = this.GetDocumentationInterWiki(link, code);
+                            if (!String.IsNullOrEmpty(interWiki))
+                            {
+                                return interWiki;
+                            }
+                        }
+
+                        break;
+
+                    case '[':
+                        // リンク
+                        if (this.TryParseLink(this.Text.Substring(i), out link))
+                        {
+                            i += link.OriginalText.Length - 1;
+
+                            // 指定言語への言語間リンクの場合、内容を取得し、処理終了
+                            if (link.Code == code && !link.IsColon)
+                            {
+                                return link.Title;
+                            }
+                        }
+
+                        break;
+                }
+            }
+
+            // 未発見の場合、空文字列
+            return String.Empty;
+        }
+
+        /// <summary>
+        /// ページがリダイレクトかをチェック。
+        /// </summary>
+        /// <returns><c>true</c> リダイレクト。</returns>
+        public bool IsRedirect()
+        {
+            // Textが設定されている場合のみ有効
+            return this.Redirect != null;
+        }
+
+        /// <summary>
+        /// ページがテンプレートかをチェック。
+        /// </summary>
+        /// <returns><c>true</c> テンプレート。</returns>
+        public bool IsTemplate()
+        {
+            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック
+            return this.IsNamespacePage(this.Website.TemplateNamespace);
+        }
+
+        /// <summary>
+        /// ページがカテゴリーかをチェック。
+        /// </summary>
+        /// <returns><c>true</c> カテゴリー。</returns>
+        public bool IsCategory()
+        {
+            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック
+            return this.IsNamespacePage(this.Website.CategoryNamespace);
+        }
+
+        /// <summary>
+        /// ページが画像かをチェック。
+        /// </summary>
+        /// <returns><c>true</c> 画像。</returns>
+        public bool IsFile()
+        {
+            // 指定されたページ名がファイル(Image:等で始まる)かをチェック
+            return this.IsNamespacePage(this.Website.FileNamespace);
+        }
+
+        /// <summary>
+        /// ページが標準名前空間かをチェック。
+        /// </summary>
+        /// <returns><c>true</c> 標準名前空間。</returns>
+        public bool IsMain()
+        {
+            // 指定されたページ名が標準名前空間以外の名前空間(Wikipedia:等で始まる)かをチェック
+            string title = this.Title.ToLower();
+            foreach (IList<string> prefixes in this.Website.Namespaces.Values)
+            {
+                foreach (string prefix in prefixes)
+                {
+                    if (title.StartsWith(prefix.ToLower() + ":"))
+                    {
+                        return false;
+                    }
+                }
+            }
+
+            return true;
+        }
+
+        #region Linkクラスに移動したいメソッド
+
+        // TODO: 以下の各メソッドのうち、リンクに関するものはLinkクラスに移したい。
+        //       また、余計な依存関係を持っているものを整理したい。
+
+        /// <summary>
+        /// 渡されたWikipediaの内部リンクを解析。
+        /// </summary>
+        /// <param name="text">[[で始まる文字列。</param>
+        /// <param name="link">解析したリンク。</param>
+        /// <returns>解析に成功した場合<c>true</c>。</returns>
+        public bool TryParseLink(string text, out Link link)
+        {
+            // 出力値初期化
+            link = null;
+
+            // 入力値確認
+            if (!text.StartsWith("[["))
+            {
+                return false;
+            }
+
+            // 構文を解析して、[[]]内部の文字列を取得
+            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・
+            string article = String.Empty;
+            string section = String.Empty;
+            IList<string> pipeTexts = new List<string>();
+            int lastIndex = -1;
+            int pipeCounter = 0;
+            bool sharpFlag = false;
+            for (int i = 2; i < text.Length; i++)
+            {
+                char c = text[i];
+
+                // ]]が見つかったら、処理正常終了
+                if (StringUtils.StartsWith(text, "]]", i))
+                {
+                    lastIndex = ++i;
+                    break;
+                }
+
+                // | が含まれている場合、以降の文字列は表示名などとして扱う
+                if (c == '|')
+                {
+                    ++pipeCounter;
+                    pipeTexts.Add(String.Empty);
+                    continue;
+                }
+
+                // 変数([[{{{1}}}]]とか)の再帰チェック
+                string dummy;
+                string variable;
+                int index = this.ChkVariable(out variable, out dummy, text, i);
+                if (index != -1)
+                {
+                    i = index;
+                    if (pipeCounter > 0)
+                    {
+                        pipeTexts[pipeCounter - 1] += variable;
+                    }
+                    else if (sharpFlag)
+                    {
+                        section += variable;
+                    }
+                    else
+                    {
+                        article += variable;
+                    }
+
+                    continue;
+                }
+
+                // | の前のとき
+                if (pipeCounter <= 0)
+                {
+                    // 変数以外で { } または < > [ ] \n が含まれている場合、リンクは無効
+                    if ((c == '<') || (c == '>') || (c == '[') || (c == ']') || (c == '{') || (c == '}') || (c == '\n'))
+                    {
+                        break;
+                    }
+
+                    // # の前のとき
+                    if (!sharpFlag)
+                    {
+                        // #が含まれている場合、以降の文字列は見出しへのリンクとして扱う(1つめの#のみ有効)
+                        if (c == '#')
+                        {
+                            sharpFlag = true;
+                        }
+                        else
+                        {
+                            article += c;
+                        }
+                    }
+                    else
+                    {
+                        // # の後のとき
+                        section += c;
+                    }
+                }
+                else
+                {
+                    // | の後のとき
+                    if (c == '<')
+                    {
+                        string subtext = text.Substring(i);
+                        string value;
+                        if (LazyXmlParser.TryParseComment(subtext, out value))
+                        {
+                            // コメント(<!--)が含まれている場合、リンクは無効
+                            break;
+                        }
+                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))
+                        {
+                            // nowikiブロック
+                            i += value.Length - 1;
+                            pipeTexts[pipeCounter - 1] += value;
+                            continue;
+                        }
+                    }
+
+                    // リンク [[ {{ ([[image:xx|[[test]]の画像]]とか)の再帰チェック
+                    Link l;
+                    index = this.ChkLinkText(out l, text, i);
+                    if (index != -1)
+                    {
+                        i = index;
+                        pipeTexts[pipeCounter - 1] += l.OriginalText;
+                        continue;
+                    }
+
+                    pipeTexts[pipeCounter - 1] += c;
+                }
+            }
+
+            // 解析失敗
+            if (lastIndex < 0)
+            {
+                return false;
+            }
+
+            // 解析に成功した場合、結果を出力値に設定
+            link = new Link();
+
+            // 変数ブロックの文字列をリンクのテキストに設定
+            link.OriginalText = text.Substring(0, lastIndex + 1);
+
+            // 前後のスペースは削除(見出しは後ろのみ)
+            link.Title = article.Trim();
+            link.Section = section.TrimEnd();
+
+            // | 以降はそのまま設定
+            link.PipeTexts = pipeTexts;
+
+            // 記事名から情報を抽出
+            // サブページ
+            if (link.Title.StartsWith("/"))
+            {
+                link.IsSubpage = true;
+            }
+            else if (link.Title.StartsWith(":"))
+            {
+                // 先頭が :
+                link.IsColon = true;
+                link.Title = link.Title.TrimStart(':').TrimStart();
+            }
+
+            // 標準名前空間以外で[[xxx:yyy]]のようになっている場合、言語コード
+            if (link.Title.Contains(":") && new MediaWikiPage(this.Website, link.Title).IsMain())
+            {
+                // ※本当は、言語コード等の一覧を作り、其処と一致するものを・・・とすべきだろうが、
+                //   メンテしきれないので : を含む名前空間以外を全て言語コード等と判定
+                link.Code = link.Title.Substring(0, link.Title.IndexOf(':')).TrimEnd();
+                link.Title = link.Title.Substring(link.Title.IndexOf(':') + 1).TrimStart();
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// 渡されたWikipediaのテンプレートを解析。
+        /// </summary>
+        /// <param name="text">{{で始まる文字列。</param>
+        /// <param name="link">解析したテンプレートのリンク。</param>
+        /// <returns>解析に成功した場合<c>true</c>。</returns>
+        public bool TryParseTemplate(string text, out Link link)
+        {
+            // 出力値初期化
+            link = null;
+
+            // 入力値確認
+            if (!text.StartsWith("{{"))
+            {
+                return false;
+            }
+
+            // 構文を解析して、{{}}内部の文字列を取得
+            // ※構文はWikipediaのプレビューで色々試して確認、足りなかったり間違ってたりするかも・・・
+            string article = String.Empty;
+            IList<string> pipeTexts = new List<string>();
+            int lastIndex = -1;
+            int pipeCounter = 0;
+            for (int i = 2; i < text.Length; i++)
+            {
+                char c = text[i];
+
+                // }}が見つかったら、処理正常終了
+                if (StringUtils.StartsWith(text, "}}", i))
+                {
+                    lastIndex = ++i;
+                    break;
+                }
+
+                // | が含まれている場合、以降の文字列は引数などとして扱う
+                if (c == '|')
+                {
+                    ++pipeCounter;
+                    pipeTexts.Add(String.Empty);
+                    continue;
+                }
+
+                // 変数([[{{{1}}}]]とか)の再帰チェック
+                string dummy;
+                string variable;
+                int index = this.ChkVariable(out variable, out dummy, text, i);
+                if (index != -1)
+                {
+                    i = index;
+                    if (pipeCounter > 0)
+                    {
+                        pipeTexts[pipeCounter - 1] += variable;
+                    }
+                    else
+                    {
+                        article += variable;
+                    }
+
+                    continue;
+                }
+
+                // | の前のとき
+                if (pipeCounter <= 0)
+                {
+                    // 変数以外で < > [ ] { } が含まれている場合、リンクは無効
+                    if ((c == '<') || (c == '>') || (c == '[') || (c == ']') || (c == '{') || (c == '}'))
+                    {
+                        break;
+                    }
+
+                    article += c;
+                }
+                else
+                {
+                    // | の後のとき
+                    if (c == '<')
+                    {
+                        string subtext = text.Substring(i);
+                        string value;
+                        if (LazyXmlParser.TryParseComment(subtext, out value))
+                        {
+                            // コメント(<!--)が含まれている場合、リンクは無効
+                            break;
+                        }
+                        else if (MediaWikiPage.TryParseNowiki(subtext, out value))
+                        {
+                            // nowikiブロック
+                            i += value.Length - 1;
+                            pipeTexts[pipeCounter - 1] += value;
+                            continue;
+                        }
+                    }
+
+                    // リンク [[ {{ ({{test|[[例]]}}とか)の再帰チェック
+                    Link l;
+                    index = this.ChkLinkText(out l, text, i);
+                    if (index != -1)
+                    {
+                        i = index;
+                        pipeTexts[pipeCounter - 1] += l.OriginalText;
+                        continue;
+                    }
+
+                    pipeTexts[pipeCounter - 1] += c;
+                }
+            }
+
+            // 解析失敗
+            if (lastIndex < 0)
+            {
+                return false;
+            }
+
+            // 解析に成功した場合、結果を出力値に設定
+            link = new Link();
+            link.IsTemplateTag = true;
+
+            // 変数ブロックの文字列をリンクのテキストに設定
+            link.OriginalText = text.Substring(0, lastIndex + 1);
+
+            // 前後のスペース・改行は削除(見出しは後ろのみ)
+            link.Title = article.Trim();
+
+            // | 以降はそのまま設定
+            link.PipeTexts = pipeTexts;
+
+            // 記事名から情報を抽出
+            // サブページ
+            if (link.Title.StartsWith("/") == true)
+            {
+                link.IsSubpage = true;
+            }
+            else if (link.Title.StartsWith(":"))
+            {
+                // 先頭が :
+                link.IsColon = true;
+                link.Title = link.Title.TrimStart(':').TrimStart();
+            }
+
+            // 先頭が msgnw:
+            link.IsMsgnw = link.Title.ToLower().StartsWith(Msgnw.ToLower());
+            if (link.IsMsgnw)
+            {
+                link.Title = link.Title.Substring(Msgnw.Length);
+            }
+
+            // 記事名直後の改行の有無
+            if (article.TrimEnd(' ').EndsWith("\n"))
+            {
+                link.Enter = true;
+            }
+
+            return true;
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 渡されたテキストの指定された位置に存在するWikipediaの内部リンク・テンプレートをチェック。
+        /// </summary>
+        /// <param name="link">解析したリンク。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <returns>正常時の戻り値には、]]の後ろの]の位置のインデックスを返す。異常時は-1。</returns>
+        public int ChkLinkText(out Link link, string text, int index)
+        {
+            // 入力値に応じて、処理を振り分け
+            if (StringUtils.StartsWith(text, "[[", index))
+            {
+                // 内部リンク
+                if (this.TryParseLink(text.Substring(index), out link))
+                {
+                    return index + link.OriginalText.Length - 1;
+                }
+            }
+            else if (StringUtils.StartsWith(text, "{{", index))
+            {
+                // テンプレート
+                if (this.TryParseTemplate(text.Substring(index), out link))
+                {
+                    return index + link.OriginalText.Length - 1;
+                }
+            }
+
+            // 出力値初期化。リンク以外の場合、nullを返す
+            link = null;
+            return -1;
+        }
+
+        /// <summary>
+        /// 渡されたテキストの指定された位置に存在する変数を解析。
+        /// </summary>
+        /// <param name="variable">解析した変数。</param>
+        /// <param name="value">変数のパラメータ値。</param>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="index">解析開始インデックス。</param>
+        /// <returns>正常時の戻り値には、変数の終了位置のインデックスを返す。異常時は-1。</returns>
+        public int ChkVariable(out string variable, out string value, string text, int index)
+        {
+            // 出力値初期化
+            int lastIndex = -1;
+            variable = String.Empty;
+            value = String.Empty;
+
+            // 入力値確認
+            if (!StringUtils.StartsWith(text, "{{{", index))
+            {
+                return lastIndex;
+            }
+
+            // ブロック終了まで取得
+            bool pipeFlag = false;
+            for (int i = index + 3; i < text.Length; i++)
+            {
+                // 終了条件のチェック
+                if (StringUtils.StartsWith(text, "}}}", i))
+                {
+                    lastIndex = i + 2;
+                    break;
+                }
+
+                if (text[i] == '<')
+                {
+                    string comment;
+                    if (LazyXmlParser.TryParseComment(text.Substring(i), out comment))
+                    {
+                        // コメント(<!--)ブロック
+                        i += comment.Length - 1;
+                        continue;
+                    }
+                }
+
+                // | が含まれている場合、以降の文字列は代入された値として扱う
+                if (text[i] == '|')
+                {
+                    pipeFlag = true;
+                }
+                else if (!pipeFlag)
+                {
+                    // | の前のとき
+                    // ※Wikipediaの仕様上は、{{{1{|表示}}} のように変数名の欄に { を
+                    //   含めることができるようだが、判別しきれないので、エラーとする
+                    //   (どうせ意図してそんなことする人は居ないだろうし・・・)
+                    if (text[i] == '{')
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    // | の後のとき
+                    if (text[i] == '<')
+                    {
+                        string nowiki;
+                        if (MediaWikiPage.TryParseNowiki(text.Substring(i), out nowiki))
+                        {
+                            // nowikiブロック
+                            i += nowiki.Length - 1;
+                            value += nowiki;
+                            continue;
+                        }
+                    }
+
+                    // 変数({{{1|{{{2}}}}}}とか)の再帰チェック
+                    string var;
+                    string dummy;
+                    int subindex = this.ChkVariable(out var, out dummy, text, i);
+                    if (subindex != -1)
+                    {
+                        i = subindex;
+                        value += var;
+                        continue;
+                    }
+
+                    // リンク [[ {{ ({{{1|[[test]]}}}とか)の再帰チェック
+                    Link link;
+                    subindex = this.ChkLinkText(out link, text, i);
+                    if (subindex != -1)
+                    {
+                        i = subindex;
+                        value += link.OriginalText;
+                        continue;
+                    }
+
+                    value += text[i];
+                }
+            }
+
+            // 変数ブロックの文字列を出力値に設定
+            if (lastIndex != -1)
+            {
+                variable = text.Substring(index, lastIndex - index + 1);
+            }
+            else
+            {
+                // 正常な構文ではなかった場合、出力値をクリア
+                variable = String.Empty;
+                value = String.Empty;
+            }
+
+            return lastIndex;
+        }
+
+        #endregion
+
+        #region 内部処理用インスタンスメソッド
+
+        /// <summary>
+        /// ページが指定された番号の名前空間に所属するかをチェック。
+        /// </summary>
+        /// <param name="id">名前空間のID。</param>
+        /// <returns><c>true</c> 所属する。</returns>
+        protected bool IsNamespacePage(int id)
+        {
+            // 指定された記事名がカテゴリー(Category:等で始まる)かをチェック
+            IList<string> prefixes = this.Website.Namespaces[id];
+            if (prefixes != null)
+            {
+                string title = this.Title.ToLower();
+                foreach (string prefix in prefixes)
+                {
+                    if (title.StartsWith(prefix.ToLower() + ":"))
+                    {
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。
+        /// 不完全な場合、例外をスローする。
+        /// </summary>
+        /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>
+        protected void ValidateIncomplete()
+        {
+            if (String.IsNullOrEmpty(this.Text))
+            {
+                // ページ本文が設定されていない場合不完全と判定
+                throw new InvalidOperationException("Text is unset");
+            }
+        }
+
+        /// <summary>
+        /// 現在のページをリダイレクトとして解析する。
+        /// </summary>
+        /// <returns>リダイレクトの場合<c>true</c>。</returns>
+        /// <remarks>リダイレクトの場合、転送先ページ名をプロパティに格納。</remarks>
+        private bool TryParseRedirect()
+        {
+            // 日本語版みたいに、#REDIRECTと言語固有の#転送みたいなのがあると思われるので、
+            // 翻訳元言語とデフォルトの設定でチェック
+            this.Redirect = null;
+            for (int i = 0; i < 2; i++)
+            {
+                string format = this.Website.Redirect;
+                if (i == 1)
+                {
+                    format = Properties.Settings.Default.MediaWikiRedirect;
+                }
+
+                if (!String.IsNullOrEmpty(format)
+                    && this.Text.ToLower().StartsWith(format.ToLower()))
+                {
+                    Link link;
+                    if (this.TryParseLink(this.Text.Substring(format.Length).TrimStart(), out link))
+                    {
+                        this.Redirect = link;
+                        return true;
+                    }
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// 渡されたTemplate:Documentationの呼び出しから、指定された言語コードへの言語間リンクを返す。
+        /// </summary>
+        /// <param name="link">テンプレート呼び出しのリンク。</param>
+        /// <param name="code">言語コード。</param>
+        /// <returns>言語間リンク先の記事名。見つからない場合またはパラメータが対象外の場合は空。</returns>
+        /// <remarks>言語間リンクが複数存在する場合は、先に発見したものを返す。</remarks>
+        private string GetDocumentationInterWiki(Link link, string code)
+        {
+            // テンプレートタグか、この言語にTemplate:Documentationの設定がされているかを確認
+            string docTitle = this.Website.DocumentationTemplate;
+            if (!link.IsTemplateTag || String.IsNullOrEmpty(docTitle))
+            {
+                return String.Empty;
+            }
+
+            // Documentationテンプレートのリンクかを確認
+            if (link.Title.ToLower() != docTitle.ToLower())
+            {
+                // 名前空間で一致していない可能性があるので、名前空間を取ってもう一度判定
+                int index = docTitle.IndexOf(':');
+                if (new MediaWikiPage(this.Website, docTitle).IsTemplate()
+                    && index >= 0 && index + 1 < docTitle.Length)
+                {
+                    docTitle = docTitle.Substring(docTitle.IndexOf(':') + 1);
+                }
+
+                if (link.Title.ToLower() != docTitle.ToLower())
+                {
+                    // どちらでも一致しない場合は別のテンプレートなりなので無視
+                    return String.Empty;
+                }
+            }
+
+            // 解説記事名を確認
+            string subtitle = link.PipeTexts.ElementAtOrDefault(0);
+            if (String.IsNullOrWhiteSpace(subtitle) || subtitle.Contains('='))
+            {
+                // 指定されていない場合はデフォルトのページを探索
+                subtitle = this.Website.DocumentationTemplateDefaultPage;
+            }
+
+            if (String.IsNullOrEmpty(subtitle))
+            {
+                return String.Empty;
+            }
+
+            // サブページの場合、親ページのページ名を付加
+            // TODO: サブページの仕組みについては要再検討
+            if (subtitle.StartsWith("/"))
+            {
+                subtitle = this.Title + subtitle;
+            }
+
+            // 解説ページから言語間リンクを取得
+            MediaWikiPage subpage = null;
+            try
+            {
+                // ※ 本当はここでの取得状況も画面に見せたいが、今のつくりで
+                //    そうするとややこしくなるので隠蔽する。
+                subpage = this.Website.GetPage(subtitle) as MediaWikiPage;
+            }
+            catch (Exception ex)
+            {
+                System.Diagnostics.Debug.WriteLine(ex.StackTrace);
+            }
+
+            if (subpage != null)
+            {
+                string interWiki = subpage.GetInterWiki(code);
+                if (!String.IsNullOrEmpty(interWiki))
+                {
+                    return interWiki;
+                }
+            }
+
+            // 未発見の場合、空文字列
+            return String.Empty;
+        }
+
+        #endregion
+
+        #region 内部クラス
+
+        /// <summary>
+        /// Wikipediaのリンクの要素を格納するための構造体。
+        /// </summary>
+        public class Link
+        {
+            #region プロパティ
+
+            /// <summary>
+            /// リンクのオブジェクト作成時の元テキスト([[~]])。
+            /// </summary>
+            public string OriginalText
+            {
+                get;
+                //// TODO: このクラスにParseを移動完了したら、protectedにする
+                set;
+            }
+
+            /// <summary>
+            /// リンクの記事名。
+            /// </summary>
+            /// <remarks>リンクに記載されていた記事名であり、名前空間の情報などは含まない可能性があるため注意。</remarks>
+            public string Title
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// リンクのセクション名(#)。
+            /// </summary>
+            public string Section
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// リンクのパイプ後の文字列(|)。
+            /// </summary>
+            public IList<string> PipeTexts
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// 言語間または他プロジェクトへのリンクの場合、コード。
+            /// </summary>
+            public string Code
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// テンプレートタグで書かれたリンク({{~}})か?
+            /// </summary>
+            /// <remarks>
+            /// 必ずしもリンク先がテンプレートであることを意味しない。
+            /// 普通のページをこの書式でテンプレートのように使用することも可能である。
+            /// </remarks>
+            public bool IsTemplateTag
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// 記事名の先頭がサブページを示す / で始まるか?
+            /// </summary>
+            /// <remarks>※ 2010年9月現在、この処理には不足あり。</remarks>
+            public bool IsSubpage
+            {
+                // TODO: サブページには相対パスで[[../~]]や[[../../~]]というような書き方もある模様。
+                //       この辺りの処理は[[Help:サブページ]]を元に全面的に見直す必要あり
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// リンクの先頭が : で始まるかを示すフラグ。
+            /// </summary>
+            public bool IsColon
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// テンプレートの場合に、テンプレートのソースをそのまま出力することを示す msgnw: が付加されているか?
+            /// </summary>
+            public bool IsMsgnw
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// テンプレートの場合に、記事名の後で改行が入るか?
+            /// </summary>
+            public bool Enter
+            {
+                get;
+                set;
+            }
+
+            /// <summary>
+            /// リンクが表すテキスト([[~]])。
+            /// </summary>
+            public string Text
+            {
+                get
+                {
+                    // 戻り値初期化
+                    StringBuilder b = new StringBuilder();
+
+                    // 枠の設定
+                    string startSign = "[[";
+                    string endSign = "]]";
+                    if (this.IsTemplateTag)
+                    {
+                        startSign = "{{";
+                        endSign = "}}";
+                    }
+
+                    // 先頭の枠の付加
+                    b.Append(startSign);
+
+                    // 先頭の : の付加
+                    if (this.IsColon)
+                    {
+                        b.Append(':');
+                    }
+
+                    // msgnw: (テンプレートを<nowiki>タグで挟む)の付加
+                    if (this.IsTemplateTag && this.IsMsgnw)
+                    {
+                        b.Append(MediaWikiPage.Msgnw);
+                    }
+
+                    // 言語コード・他プロジェクトコードの付加
+                    if (!String.IsNullOrEmpty(this.Code))
+                    {
+                        b.Append(this.Code);
+                    }
+
+                    // リンクの付加
+                    if (!String.IsNullOrEmpty(this.Title))
+                    {
+                        b.Append(this.Title);
+                    }
+
+                    // セクション名の付加
+                    if (!String.IsNullOrEmpty(this.Section))
+                    {
+                        b.Append('#');
+                        b.Append(this.Section);
+                    }
+
+                    // 改行の付加
+                    if (this.Enter)
+                    {
+                        b.Append('\n');
+                    }
+
+                    // パイプ後の文字列の付加
+                    if (this.PipeTexts != null)
+                    {
+                        foreach (string s in this.PipeTexts)
+                        {
+                            b.Append('|');
+                            if (!String.IsNullOrEmpty(s))
+                            {
+                                b.Append(s);
+                            }
+                        }
+                    }
+
+                    // 終わりの枠の付加
+                    b.Append(endSign);
+                    return b.ToString();
+                }
+            }
+
+            #endregion
+
+            #region 公開メソッド
+
+            /// <summary>
+            /// このオブジェクトを表すリンク文字列を返す。
+            /// </summary>
+            /// <returns>オブジェクトを表すリンク文字列。</returns>
+            public override string ToString()
+            {
+                // リンクを表すテキスト、ならびに元テキストを返す
+                return this.Text + "<!-- " + this.OriginalText + " -->";
+            }
+
+            #endregion
+        }
+
+        #endregion
+    }
+}
index 502842e..38d8ba2 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      ページ(Wikipediaの記事など)をあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="Page.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Linq;\r
-    using System.Text;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// ページ(Wikipediaの記事など)をあらわすモデルクラスです。\r
-    /// </summary>\r
-    public class Page\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// ページが所属するウェブサイト。\r
-        /// </summary>\r
-        private Website website;\r
-\r
-        /// <summary>\r
-        /// ページタイトル。\r
-        /// </summary>\r
-        private string title;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="text">ページの本文。</param>\r
-        /// <param name="timestamp">ページのタイムスタンプ。</param>\r
-        public Page(Website website, string title, string text, DateTime? timestamp)\r
-        {\r
-            // 初期値設定、基本的に以後外から変更されることを想定しない\r
-            this.Website = website;\r
-            this.Title = title;\r
-            this.Text = text;\r
-            this.Timestamp = timestamp;\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// ページのタイムスタンプには<c>null</c>を設定。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <param name="text">ページの本文。</param>\r
-        public Page(Website website, string title, string text)\r
-            : this(website, title, text, null)\r
-        {\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// ページの本文, タイムスタンプには<c>null</c>を設定。\r
-        /// </summary>\r
-        /// <param name="website">ページが所属するウェブサイト。</param>\r
-        /// <param name="title">ページタイトル。</param>\r
-        public Page(Website website, string title)\r
-            : this(website, title, null, null)\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// ページが所属するウェブサイト。\r
-        /// </summary>\r
-        public virtual Website Website\r
-        {\r
-            get\r
-            {\r
-                return this.website;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                // ウェブサイトは必須\r
-                this.website = Validate.NotNull(value, "website");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページタイトル。\r
-        /// </summary>\r
-        public virtual string Title\r
-        {\r
-            get\r
-            {\r
-                return this.title;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                // ページタイトルは必須\r
-                this.title = Validate.NotBlank(value, "title");\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        /// ページの本文。\r
-        /// </summary>\r
-        public virtual string Text\r
-        {\r
-            get;\r
-            protected set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// ページのタイムスタンプ。\r
-        /// </summary>\r
-        public virtual DateTime? Timestamp\r
-        {\r
-            get;\r
-            protected set;\r
-        }\r
-        \r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      ページ(Wikipediaの記事など)をあらわすモデルクラスソース</summary>
+//
+// <copyright file="Page.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Linq;
+    using System.Text;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// ページ(Wikipediaの記事など)をあらわすモデルクラスです。
+    /// </summary>
+    public class Page
+    {
+        #region private変数
+
+        /// <summary>
+        /// ページが所属するウェブサイト。
+        /// </summary>
+        private Website website;
+
+        /// <summary>
+        /// ページタイトル。
+        /// </summary>
+        private string title;
+
+        #endregion
+
+        #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)
+        {
+            // 初期値設定、基本的に以後外から変更されることを想定しない
+            this.Website = website;
+            this.Title = title;
+            this.Text = text;
+            this.Timestamp = timestamp;
+        }
+
+        /// <summary>
+        /// コンストラクタ。
+        /// ページのタイムスタンプには<c>null</c>を設定。
+        /// </summary>
+        /// <param name="website">ページが所属するウェブサイト。</param>
+        /// <param name="title">ページタイトル。</param>
+        /// <param name="text">ページの本文。</param>
+        public Page(Website website, string title, string text)
+            : this(website, title, text, null)
+        {
+        }
+
+        /// <summary>
+        /// コンストラクタ。
+        /// ページの本文, タイムスタンプには<c>null</c>を設定。
+        /// </summary>
+        /// <param name="website">ページが所属するウェブサイト。</param>
+        /// <param name="title">ページタイトル。</param>
+        public Page(Website website, string title)
+            : this(website, title, null, null)
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// ページが所属するウェブサイト。
+        /// </summary>
+        public virtual Website Website
+        {
+            get
+            {
+                return this.website;
+            }
+
+            protected set
+            {
+                // ウェブサイトは必須
+                this.website = Validate.NotNull(value, "website");
+            }
+        }
+
+        /// <summary>
+        /// ページタイトル。
+        /// </summary>
+        public virtual string Title
+        {
+            get
+            {
+                return this.title;
+            }
+
+            protected set
+            {
+                // ページタイトルは必須
+                this.title = Validate.NotBlank(value, "title");
+            }
+        }
+        
+        /// <summary>
+        /// ページの本文。
+        /// </summary>
+        public virtual string Text
+        {
+            get;
+            protected set;
+        }
+
+        /// <summary>
+        /// ページのタイムスタンプ。
+        /// </summary>
+        public virtual DateTime? Timestamp
+        {
+            get;
+            protected set;
+        }
+        
+        #endregion
+    }
+}
index f193564..d0e343b 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      言語間の翻訳パターンをあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="TranslationDictionary.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using Honememo.Models;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// 言語間の翻訳パターンをあらわすモデルクラスです。\r
-    /// </summary>\r
-    /// <remarks>用途上、大文字小文字の違いは無視する。</remarks>\r
-    public class TranslationDictionary : IgnoreCaseDictionary<TranslationDictionary.Item>, IXmlSerializable\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 翻訳元言語コード。\r
-        /// </summary>\r
-        private string from;\r
-\r
-        /// <summary>\r
-        /// 翻訳先言語コード。\r
-        /// </summary>\r
-        private string to;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(通常)。\r
-        /// </summary>\r
-        /// <param name="from">翻訳元言語コード。</param>\r
-        /// <param name="to">翻訳先言語コード。</param>\r
-        public TranslationDictionary(string from, string to)\r
-        {\r
-            // メンバ変数の初期設定\r
-            this.From = from;\r
-            this.To = to;\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(シリアライズ or 拡張用)。\r
-        /// </summary>\r
-        protected TranslationDictionary()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-        \r
-        /// <summary>\r
-        /// 翻訳元言語コード。\r
-        /// </summary>\r
-        public string From\r
-        {\r
-            get\r
-            {\r
-                return this.from;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.from = Validate.NotBlank(value, "from");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先言語コード。\r
-        /// </summary>\r
-        public string To\r
-        {\r
-            get\r
-            {\r
-                return this.to;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.to = Validate.NotBlank(value, "to");\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 静的メソッド\r
-\r
-        /// <summary>\r
-        /// コレクションから指定された言語の翻訳パターンを取得する。\r
-        /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。\r
-        /// </summary>\r
-        /// <param name="collection">翻訳パターンを含んだコレクション。</param>\r
-        /// <param name="from">翻訳元言語。</param>\r
-        /// <param name="to">翻訳先言語。</param>\r
-        /// <returns>翻訳パターン。存在しない場合は新たに作成した翻訳パターンを返す。</returns>\r
-        public static TranslationDictionary GetDictionaryNeedCreate(\r
-            ICollection<TranslationDictionary> collection, string from, string to)\r
-        {\r
-            // 設定が存在すれば取得した値を返す\r
-            foreach (TranslationDictionary d in collection)\r
-            {\r
-                if (d.From == from && d.To == to)\r
-                {\r
-                    return d;\r
-                }\r
-            }\r
-\r
-            // 存在しない場合、作成した翻訳パターンをコレクションに追加し、返す\r
-            TranslationDictionary dic = new TranslationDictionary(from, to);\r
-            collection.Add(dic);\r
-            return dic;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッド\r
-\r
-        /// <summary>\r
-        /// シリアライズするXMLのスキーマ定義を返す。\r
-        /// </summary>\r
-        /// <returns>XML表現を記述するXmlSchema。</returns>\r
-        public System.Xml.Schema.XmlSchema GetSchema()\r
-        {\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLからオブジェクトをデシリアライズする。\r
-        /// </summary>\r
-        /// <param name="reader">デシリアライズ元のXmlReader</param>\r
-        public void ReadXml(XmlReader reader)\r
-        {\r
-            XmlDocument xml = new XmlDocument();\r
-            xml.Load(reader);\r
-\r
-            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-            XmlElement tableElement = xml.DocumentElement;\r
-            this.From = tableElement.GetAttribute("From");\r
-            this.To = tableElement.GetAttribute("To");\r
-\r
-            // 各対訳の読み込み\r
-            foreach (XmlNode itemNode in tableElement.SelectNodes("Item"))\r
-            {\r
-                XmlElement itemElement = itemNode as XmlElement;\r
-                Item item = new Item();\r
-                item.Word = itemElement.GetAttribute("To");\r
-                item.Alias = itemElement.GetAttribute("Redirect");\r
-                string timestamp = itemElement.GetAttribute("Timestamp");\r
-                if (!String.IsNullOrEmpty(timestamp))\r
-                {\r
-                    item.Timestamp = DateTime.Parse(timestamp);\r
-\r
-                    // 登録日時が有効期限より古い場合は破棄する\r
-                    if (DateTime.Now - Settings.Default.CacheExpire > item.Timestamp.Value)\r
-                    {\r
-                        continue;\r
-                    }\r
-                }\r
-\r
-                this[itemElement.GetAttribute("From")] = item;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトをXMLにシリアライズする。\r
-        /// </summary>\r
-        /// <param name="writer">シリアライズ先のXmlWriter</param>\r
-        public void WriteXml(XmlWriter writer)\r
-        {\r
-            writer.WriteAttributeString("From", this.From);\r
-            writer.WriteAttributeString("To", this.To);\r
-\r
-            // 各対訳の出力\r
-            foreach (KeyValuePair<string, Item> item in this)\r
-            {\r
-                writer.WriteStartElement("Item");\r
-                writer.WriteAttributeString("From", item.Key);\r
-                writer.WriteAttributeString("To", item.Value.Word);\r
-                if (!String.IsNullOrWhiteSpace(item.Value.Alias))\r
-                {\r
-                    writer.WriteAttributeString("Redirect", item.Value.Alias);\r
-                }\r
-\r
-                if (item.Value.Timestamp.HasValue)\r
-                {\r
-                    writer.WriteAttributeString(\r
-                        "Timestamp",\r
-                        item.Value.Timestamp.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"));\r
-                }\r
-\r
-                writer.WriteEndElement();\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 構造体\r
-\r
-        /// <summary>\r
-        /// 対訳表の翻訳先をあらわす構造体です。\r
-        /// </summary>\r
-        public struct Item\r
-        {\r
-            /// <summary>\r
-            /// 翻訳先語句。\r
-            /// </summary>\r
-            /// <remarks>翻訳先の語句が存在しないことを明示する場合<c>null</c>または空。</remarks>\r
-            public string Word;\r
-\r
-            /// <summary>\r
-            /// 登録日時。\r
-            /// </summary>\r
-            /// <remarks>有効期間としても使用。無期限である場合<c>null</c>。</remarks>\r
-            public DateTime? Timestamp;\r
-\r
-            /// <summary>\r
-            /// 翻訳先別名。\r
-            /// </summary>\r
-            /// <remarks>Wikipediaのリダイレクト等を意図。別名が無い場合<c>null</c>または空。</remarks>\r
-            public string Alias;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      言語間の翻訳パターンをあらわすモデルクラスソース</summary>
+//
+// <copyright file="TranslationDictionary.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using Honememo.Models;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// 言語間の翻訳パターンをあらわすモデルクラスです。
+    /// </summary>
+    /// <remarks>用途上、大文字小文字の違いは無視する。</remarks>
+    public class TranslationDictionary : IgnoreCaseDictionary<TranslationDictionary.Item>, IXmlSerializable
+    {
+        #region private変数
+
+        /// <summary>
+        /// 翻訳元言語コード。
+        /// </summary>
+        private string from;
+
+        /// <summary>
+        /// 翻訳先言語コード。
+        /// </summary>
+        private string to;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ(通常)。
+        /// </summary>
+        /// <param name="from">翻訳元言語コード。</param>
+        /// <param name="to">翻訳先言語コード。</param>
+        public TranslationDictionary(string from, string to)
+        {
+            // メンバ変数の初期設定
+            this.From = from;
+            this.To = to;
+        }
+
+        /// <summary>
+        /// コンストラクタ(シリアライズ or 拡張用)。
+        /// </summary>
+        protected TranslationDictionary()
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+        
+        /// <summary>
+        /// 翻訳元言語コード。
+        /// </summary>
+        public string From
+        {
+            get
+            {
+                return this.from;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.from = Validate.NotBlank(value, "from");
+            }
+        }
+
+        /// <summary>
+        /// 翻訳先言語コード。
+        /// </summary>
+        public string To
+        {
+            get
+            {
+                return this.to;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.to = Validate.NotBlank(value, "to");
+            }
+        }
+
+        #endregion
+
+        #region 静的メソッド
+
+        /// <summary>
+        /// コレクションから指定された言語の翻訳パターンを取得する。
+        /// 存在しない場合は空のインスタンスを生成、コレクションに追加して返す。
+        /// </summary>
+        /// <param name="collection">翻訳パターンを含んだコレクション。</param>
+        /// <param name="from">翻訳元言語。</param>
+        /// <param name="to">翻訳先言語。</param>
+        /// <returns>翻訳パターン。存在しない場合は新たに作成した翻訳パターンを返す。</returns>
+        public static TranslationDictionary GetDictionaryNeedCreate(
+            ICollection<TranslationDictionary> collection, string from, string to)
+        {
+            // 設定が存在すれば取得した値を返す
+            foreach (TranslationDictionary d in collection)
+            {
+                if (d.From == from && d.To == to)
+                {
+                    return d;
+                }
+            }
+
+            // 存在しない場合、作成した翻訳パターンをコレクションに追加し、返す
+            TranslationDictionary dic = new TranslationDictionary(from, to);
+            collection.Add(dic);
+            return dic;
+        }
+
+        #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);
+
+            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
+            XmlElement tableElement = xml.DocumentElement;
+            this.From = tableElement.GetAttribute("From");
+            this.To = tableElement.GetAttribute("To");
+
+            // 各対訳の読み込み
+            foreach (XmlNode itemNode in tableElement.SelectNodes("Item"))
+            {
+                XmlElement itemElement = itemNode as XmlElement;
+                Item item = new Item();
+                item.Word = itemElement.GetAttribute("To");
+                item.Alias = itemElement.GetAttribute("Redirect");
+                string timestamp = itemElement.GetAttribute("Timestamp");
+                if (!String.IsNullOrEmpty(timestamp))
+                {
+                    item.Timestamp = DateTime.Parse(timestamp);
+
+                    // 登録日時が有効期限より古い場合は破棄する
+                    if (DateTime.Now - Settings.Default.CacheExpire > item.Timestamp.Value)
+                    {
+                        continue;
+                    }
+                }
+
+                this[itemElement.GetAttribute("From")] = item;
+            }
+        }
+
+        /// <summary>
+        /// オブジェクトをXMLにシリアライズする。
+        /// </summary>
+        /// <param name="writer">シリアライズ先のXmlWriter</param>
+        public void WriteXml(XmlWriter writer)
+        {
+            writer.WriteAttributeString("From", this.From);
+            writer.WriteAttributeString("To", this.To);
+
+            // 各対訳の出力
+            foreach (KeyValuePair<string, Item> item in this)
+            {
+                writer.WriteStartElement("Item");
+                writer.WriteAttributeString("From", item.Key);
+                writer.WriteAttributeString("To", item.Value.Word);
+                if (!String.IsNullOrWhiteSpace(item.Value.Alias))
+                {
+                    writer.WriteAttributeString("Redirect", item.Value.Alias);
+                }
+
+                if (item.Value.Timestamp.HasValue)
+                {
+                    writer.WriteAttributeString(
+                        "Timestamp",
+                        item.Value.Timestamp.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"));
+                }
+
+                writer.WriteEndElement();
+            }
+        }
+
+        #endregion
+
+        #region 構造体
+
+        /// <summary>
+        /// 対訳表の翻訳先をあらわす構造体です。
+        /// </summary>
+        public struct Item
+        {
+            /// <summary>
+            /// 翻訳先語句。
+            /// </summary>
+            /// <remarks>翻訳先の語句が存在しないことを明示する場合<c>null</c>または空。</remarks>
+            public string Word;
+
+            /// <summary>
+            /// 登録日時。
+            /// </summary>
+            /// <remarks>有効期間としても使用。無期限である場合<c>null</c>。</remarks>
+            public DateTime? Timestamp;
+
+            /// <summary>
+            /// 翻訳先別名。
+            /// </summary>
+            /// <remarks>Wikipediaのリダイレクト等を意図。別名が無い場合<c>null</c>または空。</remarks>
+            public string Alias;
+        }
+
+        #endregion
+    }
+}
index 7fbc201..31c8947 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      言語間の対訳表をあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="TranslationTable.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// 言語間の対訳表をあらわすモデルクラスです。\r
-    /// </summary>\r
-    public class TranslationTable : List<IDictionary<string, string>>, IXmlSerializable\r
-    {\r
-        #region プロパティ\r
-        \r
-        /// <summary>\r
-        /// 翻訳元言語コード。\r
-        /// </summary>\r
-        public string From\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 翻訳先言語コード。\r
-        /// </summary>\r
-        public string To\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開メソッド\r
-\r
-        /// <summary>\r
-        /// 指定された言語の対訳語を取得する。\r
-        /// </summary>\r
-        /// <param name="from">翻訳元言語コード。</param>\r
-        /// <param name="to">翻訳先言語コード。</param>\r
-        /// <param name="word">翻訳元語。</param>\r
-        /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>\r
-        /// <remarks>大文字小文字は区別しない。</remarks>\r
-        public string GetWord(string from, string to, string word)\r
-        {\r
-            // nullは不可。以降でエラーになるためここでチェック\r
-            Validate.NotNull(from, "from");\r
-            Validate.NotNull(to, "to");\r
-            Validate.NotNull(word, "word");\r
-\r
-            string w = word.ToLower();\r
-            foreach (IDictionary<string, string> record in this)\r
-            {\r
-                if (record.ContainsKey(from) && record[from].ToLower() == w)\r
-                {\r
-                    string c = null;\r
-                    if (record.ContainsKey(to))\r
-                    {\r
-                        c = record[to];\r
-                    }\r
-\r
-                    return c;\r
-                }\r
-            }\r
-\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されている言語の組み合わせで対訳語を取得する。\r
-        /// </summary>\r
-        /// <param name="word">翻訳元語。</param>\r
-        /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>\r
-        /// <remarks>大文字小文字は区別しない。</remarks>\r
-        public string GetWord(string word)\r
-        {\r
-            if (String.IsNullOrEmpty(this.From) || String.IsNullOrEmpty(this.To))\r
-            {\r
-                throw new InvalidOperationException("empty from or to");\r
-            }\r
-\r
-            return this.GetWord(this.From, this.To, word);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッド\r
-\r
-        /// <summary>\r
-        /// シリアライズするXMLのスキーマ定義を返す。\r
-        /// </summary>\r
-        /// <returns>XML表現を記述するXmlSchema。</returns>\r
-        public System.Xml.Schema.XmlSchema GetSchema()\r
-        {\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLからオブジェクトをデシリアライズする。\r
-        /// </summary>\r
-        /// <param name="reader">デシリアライズ元のXmlReader</param>\r
-        public void ReadXml(XmlReader reader)\r
-        {\r
-            XmlDocument xml = new XmlDocument();\r
-            xml.Load(reader);\r
-\r
-            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-            XmlElement tableElement = xml.DocumentElement;\r
-\r
-            // 各対訳の読み込み\r
-            this.Clear();\r
-            foreach (XmlNode recordNode in tableElement.SelectNodes("Group"))\r
-            {\r
-                IDictionary<string, string> record = new Dictionary<string, string>();\r
-                foreach (XmlNode wordNode in recordNode)\r
-                {\r
-                    XmlElement wordElement = wordNode as XmlElement;\r
-                    record[wordElement.GetAttribute("Lang")] = wordElement.InnerText;\r
-                }\r
-\r
-                this.Add(record);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトをXMLにシリアライズする。\r
-        /// </summary>\r
-        /// <param name="writer">シリアライズ先のXmlWriter</param>\r
-        public void WriteXml(XmlWriter writer)\r
-        {\r
-            // 各対訳の出力\r
-            foreach (IDictionary<string, string> record in this)\r
-            {\r
-                writer.WriteStartElement("Group");\r
-                foreach (KeyValuePair<string, string> word in record)\r
-                {\r
-                    writer.WriteStartElement("Word");\r
-                    writer.WriteAttributeString("Lang", word.Key);\r
-                    writer.WriteValue(word.Value);\r
-                    writer.WriteEndElement();\r
-                }\r
-\r
-                writer.WriteEndElement();\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      言語間の対訳表をあらわすモデルクラスソース</summary>
+//
+// <copyright file="TranslationTable.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// 言語間の対訳表をあらわすモデルクラスです。
+    /// </summary>
+    public class TranslationTable : List<IDictionary<string, string>>, IXmlSerializable
+    {
+        #region プロパティ
+        
+        /// <summary>
+        /// 翻訳元言語コード。
+        /// </summary>
+        public string From
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// 翻訳先言語コード。
+        /// </summary>
+        public string To
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region 公開メソッド
+
+        /// <summary>
+        /// 指定された言語の対訳語を取得する。
+        /// </summary>
+        /// <param name="from">翻訳元言語コード。</param>
+        /// <param name="to">翻訳先言語コード。</param>
+        /// <param name="word">翻訳元語。</param>
+        /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>
+        /// <remarks>大文字小文字は区別しない。</remarks>
+        public string GetWord(string from, string to, string word)
+        {
+            // nullは不可。以降でエラーになるためここでチェック
+            Validate.NotNull(from, "from");
+            Validate.NotNull(to, "to");
+            Validate.NotNull(word, "word");
+
+            string w = word.ToLower();
+            foreach (IDictionary<string, string> record in this)
+            {
+                if (record.ContainsKey(from) && record[from].ToLower() == w)
+                {
+                    string c = null;
+                    if (record.ContainsKey(to))
+                    {
+                        c = record[to];
+                    }
+
+                    return c;
+                }
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 指定されている言語の組み合わせで対訳語を取得する。
+        /// </summary>
+        /// <param name="word">翻訳元語。</param>
+        /// <returns>対訳語。登録されていない場合 <c>null</c>。</returns>
+        /// <remarks>大文字小文字は区別しない。</remarks>
+        public string GetWord(string word)
+        {
+            if (String.IsNullOrEmpty(this.From) || String.IsNullOrEmpty(this.To))
+            {
+                throw new InvalidOperationException("empty from or to");
+            }
+
+            return this.GetWord(this.From, this.To, word);
+        }
+
+        #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);
+
+            // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
+            XmlElement tableElement = xml.DocumentElement;
+
+            // 各対訳の読み込み
+            this.Clear();
+            foreach (XmlNode recordNode in tableElement.SelectNodes("Group"))
+            {
+                IDictionary<string, string> record = new Dictionary<string, string>();
+                foreach (XmlNode wordNode in recordNode)
+                {
+                    XmlElement wordElement = wordNode as XmlElement;
+                    record[wordElement.GetAttribute("Lang")] = wordElement.InnerText;
+                }
+
+                this.Add(record);
+            }
+        }
+
+        /// <summary>
+        /// オブジェクトをXMLにシリアライズする。
+        /// </summary>
+        /// <param name="writer">シリアライズ先のXmlWriter</param>
+        public void WriteXml(XmlWriter writer)
+        {
+            // 各対訳の出力
+            foreach (IDictionary<string, string> record in this)
+            {
+                writer.WriteStartElement("Group");
+                foreach (KeyValuePair<string, string> word in record)
+                {
+                    writer.WriteStartElement("Word");
+                    writer.WriteAttributeString("Lang", word.Key);
+                    writer.WriteValue(word.Value);
+                    writer.WriteEndElement();
+                }
+
+                writer.WriteEndElement();
+            }
+        }
+
+        #endregion
+    }
+}
index 61d78eb..4146322 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      ウェブサイトをあらわすモデルクラスソース</summary>\r
-//\r
-// <copyright file="Website.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.IO;\r
-    using System.Net;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// ウェブサイトをあらわすモデルクラスです。\r
-    /// </summary>\r
-    /// <remarks>言語が異なる場合は、別のウェブサイトとして扱います。</remarks>\r
-    public abstract class Website\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの場所。\r
-        /// </summary>\r
-        /// <example>http://en.wikipedia.org</example>\r
-        /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>\r
-        private string location;\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの言語。\r
-        /// </summary>\r
-        private Language language;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        /// <remarks>継承クラスでは忘れずに\r
-        /// <see cref="Location"/>, <see cref="Language"/>\r
-        /// の設定を行ってください。</remarks>\r
-        public Website()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの場所。\r
-        /// </summary>\r
-        /// <example>http://en.wikipedia.org</example>\r
-        /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>\r
-        public string Location\r
-        {\r
-            get\r
-            {\r
-                return this.location;\r
-            }\r
-\r
-            set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.location = Validate.NotBlank(value, "location");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// ウェブサイトの言語。\r
-        /// </summary>\r
-        public Language Language\r
-        {\r
-            get\r
-            {\r
-                return this.language;\r
-            }\r
-\r
-            protected set\r
-            {\r
-                // ※必須な情報が設定されていない場合、例外を返す\r
-                this.language = Validate.NotNull(value, "language");\r
-            }\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region メソッド\r
-\r
-        /// <summary>\r
-        /// ページを取得。\r
-        /// </summary>\r
-        /// <param name="title">ページタイトル。</param>\r
-        /// <returns>取得したページ。</returns>\r
-        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-        public abstract Page GetPage(string title);\r
-\r
-        /// <summary>\r
-        /// 指定されたURIの情報をストリームで取得。\r
-        /// </summary>\r
-        /// <param name="uri">取得対象のURI。</param>\r
-        /// <returns>取得したストリーム。使用後は必ずクローズすること。</returns>\r
-        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-        protected Stream GetStream(Uri uri)\r
-        {\r
-            // URIに応じたWebRequestを取得\r
-            WebRequest req = WebRequest.Create(uri);\r
-\r
-            // 設定が必要なRequestの場合は、必要な設定を行う\r
-            // ※ FileWebRequestであれば特になし、それ以外は通すが未確認\r
-            if (req as HttpWebRequest != null)\r
-            {\r
-                // HTTP/HTTPSの場合\r
-                HttpWebRequest h = req as HttpWebRequest;\r
-\r
-                // UserAgent設定\r
-                string ua = Settings.Default.UserAgent;\r
-                if (String.IsNullOrEmpty(ua))\r
-                {\r
-                    // 特に設定が無い場合はデフォルトの値を設定\r
-                    Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;\r
-                    ua = String.Format(\r
-                        Settings.Default.DefaultUserAgent,\r
-                        ver.Major,\r
-                        ver.Minor);\r
-                }\r
-\r
-                h.UserAgent = ua;\r
-\r
-                // Referer設定\r
-                string referer = Settings.Default.Referer;\r
-                if (String.IsNullOrEmpty(referer))\r
-                {\r
-                    referer = String.Empty;\r
-                }\r
-\r
-                h.Referer = referer;\r
-            }\r
-\r
-            // 応答データを受信するためのStreamを取得し、データを取得\r
-            System.Diagnostics.Debug.WriteLine("Website.GetStream > " + uri.ToString());\r
-            return req.GetResponse().GetResponseStream();\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      ウェブサイトをあらわすモデルクラスソース</summary>
+//
+// <copyright file="Website.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.IO;
+    using System.Net;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// ウェブサイトをあらわすモデルクラスです。
+    /// </summary>
+    /// <remarks>言語が異なる場合は、別のウェブサイトとして扱います。</remarks>
+    public abstract class Website
+    {
+        #region private変数
+
+        /// <summary>
+        /// ウェブサイトの場所。
+        /// </summary>
+        /// <example>http://en.wikipedia.org</example>
+        /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>
+        private string location;
+
+        /// <summary>
+        /// ウェブサイトの言語。
+        /// </summary>
+        private Language language;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// コンストラクタ。
+        /// </summary>
+        /// <remarks>継承クラスでは忘れずに
+        /// <see cref="Location"/>, <see cref="Language"/>
+        /// の設定を行ってください。</remarks>
+        public Website()
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// ウェブサイトの場所。
+        /// </summary>
+        /// <example>http://en.wikipedia.org</example>
+        /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>
+        public string Location
+        {
+            get
+            {
+                return this.location;
+            }
+
+            set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.location = Validate.NotBlank(value, "location");
+            }
+        }
+
+        /// <summary>
+        /// ウェブサイトの言語。
+        /// </summary>
+        public Language Language
+        {
+            get
+            {
+                return this.language;
+            }
+
+            protected set
+            {
+                // ※必須な情報が設定されていない場合、例外を返す
+                this.language = Validate.NotNull(value, "language");
+            }
+        }
+
+        #endregion
+        
+        #region メソッド
+
+        /// <summary>
+        /// ページを取得。
+        /// </summary>
+        /// <param name="title">ページタイトル。</param>
+        /// <returns>取得したページ。</returns>
+        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+        public abstract Page GetPage(string title);
+
+        /// <summary>
+        /// 指定されたURIの情報をストリームで取得。
+        /// </summary>
+        /// <param name="uri">取得対象のURI。</param>
+        /// <returns>取得したストリーム。使用後は必ずクローズすること。</returns>
+        /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+        protected Stream GetStream(Uri uri)
+        {
+            // URIに応じたWebRequestを取得
+            WebRequest req = WebRequest.Create(uri);
+
+            // 設定が必要なRequestの場合は、必要な設定を行う
+            // ※ FileWebRequestであれば特になし、それ以外は通すが未確認
+            if (req as HttpWebRequest != null)
+            {
+                // HTTP/HTTPSの場合
+                HttpWebRequest h = req as HttpWebRequest;
+
+                // UserAgent設定
+                string ua = Settings.Default.UserAgent;
+                if (String.IsNullOrEmpty(ua))
+                {
+                    // 特に設定が無い場合はデフォルトの値を設定
+                    Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
+                    ua = String.Format(
+                        Settings.Default.DefaultUserAgent,
+                        ver.Major,
+                        ver.Minor);
+                }
+
+                h.UserAgent = ua;
+
+                // Referer設定
+                string referer = Settings.Default.Referer;
+                if (String.IsNullOrEmpty(referer))
+                {
+                    referer = String.Empty;
+                }
+
+                h.Referer = referer;
+            }
+
+            // 応答データを受信するためのStreamを取得し、データを取得
+            System.Diagnostics.Debug.WriteLine("Website.GetStream > " + uri.ToString());
+            return req.GetResponse().GetResponseStream();
+        }
+
+        #endregion
+    }
+}
index 7132d3e..6baef7c 100644 (file)
@@ -1,40 +1,40 @@
-// ================================================================================================\r
-// <summary>\r
-//      アプリケーション起動用クラスソース</summary>\r
-//\r
-// <copyright file="Program.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs\r
-{\r
-    using System;\r
-    using System.Windows.Forms;\r
-\r
-    /// <summary>\r
-    /// アプリケーション起動時に最初に呼ばれるクラスです。\r
-    /// </summary>\r
-    internal static class Program\r
-    {\r
-        /// <summary>\r
-        /// アプリケーションのメイン エントリ ポイントです。\r
-        /// </summary>\r
-        [STAThread]\r
-        private static void Main()\r
-        {\r
-            // 初回実行時は古いバージョンの設定があればバージョンアップ\r
-            if (!Properties.Settings.Default.IsUpgraded)\r
-            {\r
-                // 現バージョンを上書きしてしまうため一度だけ実施\r
-                Properties.Settings.Default.Upgrade();\r
-                Properties.Settings.Default.IsUpgraded = true;\r
-            }\r
-\r
-            Application.EnableVisualStyles();\r
-            Application.SetCompatibleTextRenderingDefault(false);\r
-            Application.Run(new MainForm());\r
-        }\r
-    }\r
+// ================================================================================================
+// <summary>
+//      アプリケーション起動用クラスソース</summary>
+//
+// <copyright file="Program.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs
+{
+    using System;
+    using System.Windows.Forms;
+
+    /// <summary>
+    /// アプリケーション起動時に最初に呼ばれるクラスです。
+    /// </summary>
+    internal static class Program
+    {
+        /// <summary>
+        /// アプリケーションのメイン エントリ ポイントです。
+        /// </summary>
+        [STAThread]
+        private static void Main()
+        {
+            // 初回実行時は古いバージョンの設定があればバージョンアップ
+            if (!Properties.Settings.Default.IsUpgraded)
+            {
+                // 現バージョンを上書きしてしまうため一度だけ実施
+                Properties.Settings.Default.Upgrade();
+                Properties.Settings.Default.IsUpgraded = true;
+            }
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new MainForm());
+        }
+    }
 }
\ No newline at end of file
index 80438f2..f0d4ed2 100644 (file)
@@ -1,40 +1,40 @@
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia翻訳支援ツールのアセンブリソース</summary>\r
-//\r
-// <copyright file="AssemblyInfo.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-using System.Reflection;\r
-using System.Runtime.CompilerServices;\r
-using System.Runtime.InteropServices;\r
-\r
-// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 \r
-// アセンブリに関連付けられている情報を変更するには、\r
-// これらの属性値を変更してください。\r
-[assembly: AssemblyTitle("Wikipedia 翻訳支援ツール")]\r
-[assembly: AssemblyDescription("Wikipediaでの言語間翻訳をサポートするためのツール")]\r
-[assembly: AssemblyConfiguration("")]\r
-[assembly: AssemblyCompany("")]\r
-[assembly: AssemblyProduct("Wikipedia 翻訳支援ツール")]\r
-[assembly: AssemblyCopyright("Copyright (C) Honeplus 2011")]\r
-[assembly: AssemblyTrademark("")]\r
-[assembly: AssemblyCulture("")]\r
-\r
-// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントには \r
-// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 \r
-// その型の ComVisible 属性を true に設定してください。\r
-[assembly: ComVisible(false)]\r
-\r
-// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\r
-[assembly: Guid("404a79d4-250a-427c-8e84-375abeba27a4")]\r
-\r
-// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\r
-//      Major Version\r
-//      Minor Version \r
-//      Build Number\r
-//      Revision\r
-[assembly: AssemblyVersion("1.01.*")]\r
+// ================================================================================================
+// <summary>
+//      Wikipedia翻訳支援ツールのアセンブリソース</summary>
+//
+// <copyright file="AssemblyInfo.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 
+// アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更してください。
+[assembly: AssemblyTitle("Wikipedia 翻訳支援ツール")]
+[assembly: AssemblyDescription("Wikipediaでの言語間翻訳をサポートするためのツール")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Wikipedia 翻訳支援ツール")]
+[assembly: AssemblyCopyright("Copyright (C) Honeplus 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントには 
+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
+[assembly: Guid("404a79d4-250a-427c-8e84-375abeba27a4")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+[assembly: AssemblyVersion("1.01.*")]
index 2606ce8..2960417 100644 (file)
-//------------------------------------------------------------------------------\r
-// <auto-generated>\r
-//     このコードはツールによって生成されました。\r
-//     ランタイム バージョン:4.0.30319.225\r
-//\r
-//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\r
-//     コードが再生成されるときに損失したりします。\r
-// </auto-generated>\r
-//------------------------------------------------------------------------------\r
-\r
-namespace Honememo.Wptscs.Properties {\r
-    using System;\r
-    \r
-    \r
-    /// <summary>\r
-    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\r
-    /// </summary>\r
-    // このクラスは StronglyTypedResourceBuilder クラスが ResGen\r
-    // または Visual Studio のようなツールを使用して自動生成されました。\r
-    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\r
-    // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。\r
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]\r
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
-    internal class Resources {\r
-        \r
-        private static global::System.Resources.ResourceManager resourceMan;\r
-        \r
-        private static global::System.Globalization.CultureInfo resourceCulture;\r
-        \r
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]\r
-        internal Resources() {\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。\r
-        /// </summary>\r
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
-        internal static global::System.Resources.ResourceManager ResourceManager {\r
-            get {\r
-                if (object.ReferenceEquals(resourceMan, null)) {\r
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Honememo.Wptscs.Properties.Resources", typeof(Resources).Assembly);\r
-                    resourceMan = temp;\r
-                }\r
-                return resourceMan;\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\r
-        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\r
-        /// </summary>\r
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
-        internal static global::System.Globalization.CultureInfo Culture {\r
-            get {\r
-                return resourceCulture;\r
-            }\r
-            set {\r
-                resourceCulture = value;\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   Wikipedia 翻訳支援ツール Ver{0}.{1:D2} に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ApplicationName {\r
-            get {\r
-                return ResourceManager.GetString("ApplicationName", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   &lt;!-- {0}、[[:{1}:{2}]]({3}(UTC))より --&gt; に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ArticleFooter {\r
-            get {\r
-                return ResourceManager.GetString("ArticleFooter", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   一時ファイルの作成に失敗しました。設定ファイルに異常が無いか、また以下のフォルダにファイルが作成可能かを確認してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessage_TemporayError {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessage_TemporayError", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   設定ファイル読み込み時にエラーが発生しました。ファイルが破損している可能性があります。\r
-        ///\r
-        ///{0} に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessageConfigLordFailed {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessageConfigLordFailed", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   設定ファイル{0}が見つかりません。インストールファイルを確認してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessageConfigNotFound {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessageConfigNotFound", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   設定ファイル保存時にエラーが発生しました。現在の設定は保存されていません。\r
-        ///\r
-        ///{0} に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessageConfigSaveFailed {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessageConfigSaveFailed", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   サーバーへの接続に失敗しました。ネットワークの設定、またはサーバーの状態を確認してください。({0}) に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessageConnectionFailed {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessageConnectionFailed", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   想定外のエラーが発生しました。プログラムが不安定な状態になった可能性があります。プログラムを再起動してください。\r
-        ///問題が再発する場合は、設定ファイルを削除するなどしてから、プログラムを再起動してください。\r
-        ///また、手順や現在の設定を確認し、開発者にご連絡ください。\r
-        ///\r
-        ///<エラーの内容>\r
-        ///{0}\r
-        ///{1} に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorMessageDevelopmentError {\r
-            get {\r
-                return ResourceManager.GetString("ErrorMessageDevelopmentError", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   エラー に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string ErrorTitle {\r
-            get {\r
-                return ResourceManager.GetString("ErrorTitle", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   {0} ({1}) に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string HeadingViewHeaderText {\r
-            get {\r
-                return ResourceManager.GetString("HeadingViewHeaderText", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   現在、{0}には未対応ですm(__)m に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string InformationMessage_DevelopingMethod {\r
-            get {\r
-                return ResourceManager.GetString("InformationMessage_DevelopingMethod", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   お知らせ に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string InformationTitle {\r
-            get {\r
-                return ResourceManager.GetString("InformationTitle", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   注意:この記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_ArticleExistInterWiki {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_ArticleExistInterWiki", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   翻訳元として指定された記事は存在しません。記事名を確認してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_ArticleNothing {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_ArticleNothing", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   言語間リンクの探索、見出しの変換を行います に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_CheckAndReplaceStart {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_CheckAndReplaceStart", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   \r
-        ///処理結果を {0} に出力しました。このログは {1} に保存されます。\r
-        /// に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_End {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_End", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   \r
-        ///ファイル {0} の保存に失敗しました。({1})\r
-        /// に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_ErrorFileSave {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_ErrorFileSave", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   要求したURLは {0} です。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_ErrorURL {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_ErrorURL", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   {0} より [[{1}]] を取得。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_GetArticle {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_GetArticle", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   言語間リンク無し に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_InterWikiNothing {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_InterWikiNothing", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   記事無し に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_LinkArticleNothing {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_LinkArticleNothing", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   リダイレクト に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_Redirect {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_Redirect", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   {0}、実行日時 {1}\r
-        ///\r
-        /// に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_Start {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_Start", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   \r
-        ///処理を中止しました。このログは {0} に保存されます。\r
-        /// に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_Stop {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_Stop", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   {{{{0}}}} の識別に失敗しました。{{{{0}}}} は {{1}}名前空間の記事して処理します。({{2}}) に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessage_TemplateUnknown {\r
-            get {\r
-                return ResourceManager.GetString("LogMessage_TemplateUnknown", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///    ※キャッシュ に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string LogMessageTranslation {\r
-            get {\r
-                return ResourceManager.GetString("LogMessageTranslation", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   対象の記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。処理を続けますか? に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string QuestionMessage_ArticleExist {\r
-            get {\r
-                return ResourceManager.GetString("QuestionMessage_ArticleExist", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   {0}を行います。よろしいですか? に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string QuestionMessage_CommonWorkQuestion {\r
-            get {\r
-                return ResourceManager.GetString("QuestionMessage_CommonWorkQuestion", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   確認 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string QuestionTitle {\r
-            get {\r
-                return ResourceManager.GetString("QuestionTitle", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   → に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string RightArrow {\r
-            get {\r
-                return ResourceManager.GetString("RightArrow", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   キャッシュの保存に失敗しました。今回参照したページの情報は、アプリケーション終了まで有効です。\r
-        ///\r
-        ///{0} に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageCacheSaveFailed {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageCacheSaveFailed", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   言語コードが重複しています。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageDuplicateCodeColumn {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageDuplicateCodeColumn", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   記事名を指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageEmptyArticle {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageEmptyArticle", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   言語コードは必須です。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageEmptyCodeColumn {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageEmptyCodeColumn", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   出力先フォルダを指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageEmptySaveDirectory {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageEmptySaveDirectory", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   翻訳元言語、記事名、翻訳先言語は必須です。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageEmptyTranslationDictionary {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageEmptyTranslationDictionary", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   翻訳元/先に同じ言語コードが指定されています。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageEqualsSourceAndTarget {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageEqualsSourceAndTarget", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   キャッシュ有効期限には0以上の数値を指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageIgnoreCacheExpire {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageIgnoreCacheExpire", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   名前空間のIDには数値を指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageIgnoreNumericNamespace {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageIgnoreNumericNamespace", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   出力先フォルダが存在しないか無効なパスです。出力先を確認してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageIgnoreSaveDirectory {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageIgnoreSaveDirectory", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   翻訳元の言語を指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageNotSelectedSource {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageNotSelectedSource", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   翻訳先の言語を指定してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageNotSelectedTarget {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageNotSelectedTarget", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   略称を指定する場合、呼称も入力してください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageShortNameColumnOnly {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageShortNameColumnOnly", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   括弧の書式は、内部に {0} を含む必要があります。また、括弧書きを使用しない場合は、この項目を空欄にしてください。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageUnformatedBracket {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageUnformatedBracket", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   取得日時には日付または空欄を指定してください。\r
-        ///空欄の場合、この置き換えは無期限で有効になります。 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningMessageUnformatedTimestamp {\r
-            get {\r
-                return ResourceManager.GetString("WarningMessageUnformatedTimestamp", resourceCulture);\r
-            }\r
-        }\r
-        \r
-        /// <summary>\r
-        ///   警告 に類似しているローカライズされた文字列を検索します。\r
-        /// </summary>\r
-        internal static string WarningTitle {\r
-            get {\r
-                return ResourceManager.GetString("WarningTitle", resourceCulture);\r
-            }\r
-        }\r
-    }\r
-}\r
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     このコードはツールによって生成されました。
+//     ランタイム バージョン:4.0.30319.225
+//
+//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+//     コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Honememo.Wptscs.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
+    /// </summary>
+    // このクラスは StronglyTypedResourceBuilder クラスが ResGen
+    // または Visual Studio のようなツールを使用して自動生成されました。
+    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
+    // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Honememo.Wptscs.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
+        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Wikipedia 翻訳支援ツール Ver{0}.{1:D2} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ApplicationName {
+            get {
+                return ResourceManager.GetString("ApplicationName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   &lt;!-- {0}、[[:{1}:{2}]]({3}(UTC))より --&gt; に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ArticleFooter {
+            get {
+                return ResourceManager.GetString("ArticleFooter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   一時ファイルの作成に失敗しました。設定ファイルに異常が無いか、また以下のフォルダにファイルが作成可能かを確認してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessage_TemporayError {
+            get {
+                return ResourceManager.GetString("ErrorMessage_TemporayError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   設定ファイル読み込み時にエラーが発生しました。ファイルが破損している可能性があります。
+        ///
+        ///{0} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessageConfigLordFailed {
+            get {
+                return ResourceManager.GetString("ErrorMessageConfigLordFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   設定ファイル{0}が見つかりません。インストールファイルを確認してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessageConfigNotFound {
+            get {
+                return ResourceManager.GetString("ErrorMessageConfigNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   設定ファイル保存時にエラーが発生しました。現在の設定は保存されていません。
+        ///
+        ///{0} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessageConfigSaveFailed {
+            get {
+                return ResourceManager.GetString("ErrorMessageConfigSaveFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   サーバーへの接続に失敗しました。ネットワークの設定、またはサーバーの状態を確認してください。({0}) に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessageConnectionFailed {
+            get {
+                return ResourceManager.GetString("ErrorMessageConnectionFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   想定外のエラーが発生しました。プログラムが不安定な状態になった可能性があります。プログラムを再起動してください。
+        ///問題が再発する場合は、設定ファイルを削除するなどしてから、プログラムを再起動してください。
+        ///また、手順や現在の設定を確認し、開発者にご連絡ください。
+        ///
+        ///<エラーの内容>
+        ///{0}
+        ///{1} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorMessageDevelopmentError {
+            get {
+                return ResourceManager.GetString("ErrorMessageDevelopmentError", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   エラー に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string ErrorTitle {
+            get {
+                return ResourceManager.GetString("ErrorTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   {0} ({1}) に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string HeadingViewHeaderText {
+            get {
+                return ResourceManager.GetString("HeadingViewHeaderText", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   現在、{0}には未対応ですm(__)m に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string InformationMessage_DevelopingMethod {
+            get {
+                return ResourceManager.GetString("InformationMessage_DevelopingMethod", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   お知らせ に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string InformationTitle {
+            get {
+                return ResourceManager.GetString("InformationTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   注意:この記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_ArticleExistInterWiki {
+            get {
+                return ResourceManager.GetString("LogMessage_ArticleExistInterWiki", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   翻訳元として指定された記事は存在しません。記事名を確認してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_ArticleNothing {
+            get {
+                return ResourceManager.GetString("LogMessage_ArticleNothing", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   言語間リンクの探索、見出しの変換を行います に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_CheckAndReplaceStart {
+            get {
+                return ResourceManager.GetString("LogMessage_CheckAndReplaceStart", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   
+        ///処理結果を {0} に出力しました。このログは {1} に保存されます。
+        /// に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_End {
+            get {
+                return ResourceManager.GetString("LogMessage_End", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   
+        ///ファイル {0} の保存に失敗しました。({1})
+        /// に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_ErrorFileSave {
+            get {
+                return ResourceManager.GetString("LogMessage_ErrorFileSave", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   要求したURLは {0} です。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_ErrorURL {
+            get {
+                return ResourceManager.GetString("LogMessage_ErrorURL", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   {0} より [[{1}]] を取得。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_GetArticle {
+            get {
+                return ResourceManager.GetString("LogMessage_GetArticle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   言語間リンク無し に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_InterWikiNothing {
+            get {
+                return ResourceManager.GetString("LogMessage_InterWikiNothing", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   記事無し に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_LinkArticleNothing {
+            get {
+                return ResourceManager.GetString("LogMessage_LinkArticleNothing", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   リダイレクト に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_Redirect {
+            get {
+                return ResourceManager.GetString("LogMessage_Redirect", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   {0}、実行日時 {1}
+        ///
+        /// に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_Start {
+            get {
+                return ResourceManager.GetString("LogMessage_Start", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   
+        ///処理を中止しました。このログは {0} に保存されます。
+        /// に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_Stop {
+            get {
+                return ResourceManager.GetString("LogMessage_Stop", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   {{{{0}}}} の識別に失敗しました。{{{{0}}}} は {{1}}名前空間の記事して処理します。({{2}}) に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessage_TemplateUnknown {
+            get {
+                return ResourceManager.GetString("LogMessage_TemplateUnknown", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///    ※キャッシュ に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string LogMessageTranslation {
+            get {
+                return ResourceManager.GetString("LogMessageTranslation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   対象の記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。処理を続けますか? に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string QuestionMessage_ArticleExist {
+            get {
+                return ResourceManager.GetString("QuestionMessage_ArticleExist", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   {0}を行います。よろしいですか? に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string QuestionMessage_CommonWorkQuestion {
+            get {
+                return ResourceManager.GetString("QuestionMessage_CommonWorkQuestion", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   確認 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string QuestionTitle {
+            get {
+                return ResourceManager.GetString("QuestionTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   → に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string RightArrow {
+            get {
+                return ResourceManager.GetString("RightArrow", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   キャッシュの保存に失敗しました。今回参照したページの情報は、アプリケーション終了まで有効です。
+        ///
+        ///{0} に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageCacheSaveFailed {
+            get {
+                return ResourceManager.GetString("WarningMessageCacheSaveFailed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   言語コードが重複しています。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageDuplicateCodeColumn {
+            get {
+                return ResourceManager.GetString("WarningMessageDuplicateCodeColumn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   記事名を指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageEmptyArticle {
+            get {
+                return ResourceManager.GetString("WarningMessageEmptyArticle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   言語コードは必須です。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageEmptyCodeColumn {
+            get {
+                return ResourceManager.GetString("WarningMessageEmptyCodeColumn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   出力先フォルダを指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageEmptySaveDirectory {
+            get {
+                return ResourceManager.GetString("WarningMessageEmptySaveDirectory", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   翻訳元言語、記事名、翻訳先言語は必須です。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageEmptyTranslationDictionary {
+            get {
+                return ResourceManager.GetString("WarningMessageEmptyTranslationDictionary", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   翻訳元/先に同じ言語コードが指定されています。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageEqualsSourceAndTarget {
+            get {
+                return ResourceManager.GetString("WarningMessageEqualsSourceAndTarget", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   キャッシュ有効期限には0以上の数値を指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageIgnoreCacheExpire {
+            get {
+                return ResourceManager.GetString("WarningMessageIgnoreCacheExpire", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   名前空間のIDには数値を指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageIgnoreNumericNamespace {
+            get {
+                return ResourceManager.GetString("WarningMessageIgnoreNumericNamespace", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   出力先フォルダが存在しないか無効なパスです。出力先を確認してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageIgnoreSaveDirectory {
+            get {
+                return ResourceManager.GetString("WarningMessageIgnoreSaveDirectory", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   翻訳元の言語を指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageNotSelectedSource {
+            get {
+                return ResourceManager.GetString("WarningMessageNotSelectedSource", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   翻訳先の言語を指定してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageNotSelectedTarget {
+            get {
+                return ResourceManager.GetString("WarningMessageNotSelectedTarget", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   略称を指定する場合、呼称も入力してください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageShortNameColumnOnly {
+            get {
+                return ResourceManager.GetString("WarningMessageShortNameColumnOnly", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   括弧の書式は、内部に {0} を含む必要があります。また、括弧書きを使用しない場合は、この項目を空欄にしてください。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageUnformatedBracket {
+            get {
+                return ResourceManager.GetString("WarningMessageUnformatedBracket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   取得日時には日付または空欄を指定してください。
+        ///空欄の場合、この置き換えは無期限で有効になります。 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningMessageUnformatedTimestamp {
+            get {
+                return ResourceManager.GetString("WarningMessageUnformatedTimestamp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   警告 に類似しているローカライズされた文字列を検索します。
+        /// </summary>
+        internal static string WarningTitle {
+            get {
+                return ResourceManager.GetString("WarningTitle", resourceCulture);
+            }
+        }
+    }
+}
index b49079d..b446d12 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<root>\r
-  <!-- \r
-    Microsoft ResX Schema \r
-    \r
-    Version 2.0\r
-    \r
-    The primary goals of this format is to allow a simple XML format \r
-    that is mostly human readable. The generation and parsing of the \r
-    various data types are done through the TypeConverter classes \r
-    associated with the data types.\r
-    \r
-    Example:\r
-    \r
-    ... ado.net/XML headers & schema ...\r
-    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
-    <resheader name="version">2.0</resheader>\r
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
-        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
-    </data>\r
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
-        <comment>This is a comment</comment>\r
-    </data>\r
-                \r
-    There are any number of "resheader" rows that contain simple \r
-    name/value pairs.\r
-    \r
-    Each data row contains a name, and value. The row also contains a \r
-    type or mimetype. Type corresponds to a .NET class that support \r
-    text/value conversion through the TypeConverter architecture. \r
-    Classes that don't support this are serialized and stored with the \r
-    mimetype set.\r
-    \r
-    The mimetype is used for serialized objects, and tells the \r
-    ResXResourceReader how to depersist the object. This is currently not \r
-    extensible. For a given mimetype the value must be set accordingly:\r
-    \r
-    Note - application/x-microsoft.net.object.binary.base64 is the format \r
-    that the ResXResourceWriter will generate, however the reader can \r
-    read any of the formats listed below.\r
-    \r
-    mimetype: application/x-microsoft.net.object.binary.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
-            : and then encoded with base64 encoding.\r
-    \r
-    mimetype: application/x-microsoft.net.object.soap.base64\r
-    value   : The object must be serialized with \r
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
-            : and then encoded with base64 encoding.\r
-\r
-    mimetype: application/x-microsoft.net.object.bytearray.base64\r
-    value   : The object must be serialized into a byte array \r
-            : using a System.ComponentModel.TypeConverter\r
-            : and then encoded with base64 encoding.\r
-    -->\r
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
-    <xsd:element name="root" msdata:IsDataSet="true">\r
-      <xsd:complexType>\r
-        <xsd:choice maxOccurs="unbounded">\r
-          <xsd:element name="metadata">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" use="required" type="xsd:string" />\r
-              <xsd:attribute name="type" type="xsd:string" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="assembly">\r
-            <xsd:complexType>\r
-              <xsd:attribute name="alias" type="xsd:string" />\r
-              <xsd:attribute name="name" type="xsd:string" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="data">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
-              <xsd:attribute ref="xml:space" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-          <xsd:element name="resheader">\r
-            <xsd:complexType>\r
-              <xsd:sequence>\r
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
-              </xsd:sequence>\r
-              <xsd:attribute name="name" type="xsd:string" use="required" />\r
-            </xsd:complexType>\r
-          </xsd:element>\r
-        </xsd:choice>\r
-      </xsd:complexType>\r
-    </xsd:element>\r
-  </xsd:schema>\r
-  <resheader name="resmimetype">\r
-    <value>text/microsoft-resx</value>\r
-  </resheader>\r
-  <resheader name="version">\r
-    <value>2.0</value>\r
-  </resheader>\r
-  <resheader name="reader">\r
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <resheader name="writer">\r
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
-  </resheader>\r
-  <data name="ApplicationName" xml:space="preserve">\r
-    <value>Wikipedia 翻訳支援ツール Ver{0}.{1:D2}</value>\r
-    <comment>アプリケーション名メジャーバージョン.マイナーバージョン付き</comment>\r
-  </data>\r
-  <data name="ArticleFooter" xml:space="preserve">\r
-    <value>&lt;!-- {0}、[[:{1}:{2}]]({3}(UTC))より --&gt;</value>\r
-  </data>\r
-  <data name="ErrorMessage_TemporayError" xml:space="preserve">\r
-    <value>一時ファイルの作成に失敗しました。設定ファイルに異常が無いか、また以下のフォルダにファイルが作成可能かを確認してください。</value>\r
-  </data>\r
-  <data name="ErrorMessageConfigLordFailed" xml:space="preserve">\r
-    <value>設定ファイル読み込み時にエラーが発生しました。ファイルが破損している可能性があります。\r
-\r
-{0}</value>\r
-    <comment>設定ファイルの読み込み時にエラーが発生した場合のメッセージ</comment>\r
-  </data>\r
-  <data name="ErrorMessageConfigNotFound" xml:space="preserve">\r
-    <value>設定ファイル{0}が見つかりません。インストールファイルを確認してください。</value>\r
-    <comment>プログラム付属の設定ファイルが存在しない場合のメッセージ</comment>\r
-  </data>\r
-  <data name="ErrorMessageConfigSaveFailed" xml:space="preserve">\r
-    <value>設定ファイル保存時にエラーが発生しました。現在の設定は保存されていません。\r
-\r
-{0}</value>\r
-    <comment>設定ファイルの保存時にエラーが発生した場合のメッセージ</comment>\r
-  </data>\r
-  <data name="ErrorMessageConnectionFailed" xml:space="preserve">\r
-    <value>サーバーへの接続に失敗しました。ネットワークの設定、またはサーバーの状態を確認してください。({0})</value>\r
-    <comment>サーバーへの接続失敗</comment>\r
-  </data>\r
-  <data name="ErrorMessageDevelopmentError" xml:space="preserve">\r
-    <value>想定外のエラーが発生しました。プログラムが不安定な状態になった可能性があります。プログラムを再起動してください。\r
-問題が再発する場合は、設定ファイルを削除するなどしてから、プログラムを再起動してください。\r
-また、手順や現在の設定を確認し、開発者にご連絡ください。\r
-\r
-<エラーの内容>\r
-{0}\r
-{1}</value>\r
-    <comment>プログラムで想定していない何らかのエラーが発生した場合のメッセージ</comment>\r
-  </data>\r
-  <data name="ErrorTitle" xml:space="preserve">\r
-    <value>エラー</value>\r
-    <comment>エラーダイアログのタイトル</comment>\r
-  </data>\r
-  <data name="InformationMessage_DevelopingMethod" xml:space="preserve">\r
-    <value>現在、{0}には未対応ですm(__)m</value>\r
-  </data>\r
-  <data name="InformationTitle" xml:space="preserve">\r
-    <value>お知らせ</value>\r
-    <comment>お知らせダイアログのタイトル</comment>\r
-  </data>\r
-  <data name="LogMessage_ArticleExistInterWiki" xml:space="preserve">\r
-    <value>注意:この記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。</value>\r
-  </data>\r
-  <data name="LogMessage_ArticleNothing" xml:space="preserve">\r
-    <value>翻訳元として指定された記事は存在しません。記事名を確認してください。</value>\r
-  </data>\r
-  <data name="LogMessage_CheckAndReplaceStart" xml:space="preserve">\r
-    <value>言語間リンクの探索、見出しの変換を行います</value>\r
-  </data>\r
-  <data name="LogMessage_End" xml:space="preserve">\r
-    <value>\r
-処理結果を {0} に出力しました。このログは {1} に保存されます。\r
-</value>\r
-  </data>\r
-  <data name="LogMessage_ErrorFileSave" xml:space="preserve">\r
-    <value>\r
-ファイル {0} の保存に失敗しました。({1})\r
-</value>\r
-  </data>\r
-  <data name="LogMessage_ErrorURL" xml:space="preserve">\r
-    <value>要求したURLは {0} です。</value>\r
-  </data>\r
-  <data name="LogMessage_GetArticle" xml:space="preserve">\r
-    <value>{0} より [[{1}]] を取得。</value>\r
-  </data>\r
-  <data name="LogMessage_InterWikiNothing" xml:space="preserve">\r
-    <value>言語間リンク無し</value>\r
-  </data>\r
-  <data name="LogMessage_LinkArticleNothing" xml:space="preserve">\r
-    <value>記事無し</value>\r
-  </data>\r
-  <data name="LogMessage_Redirect" xml:space="preserve">\r
-    <value>リダイレクト</value>\r
-  </data>\r
-  <data name="LogMessage_Start" xml:space="preserve">\r
-    <value>{0}、実行日時 {1}\r
-\r
-</value>\r
-  </data>\r
-  <data name="LogMessage_Stop" xml:space="preserve">\r
-    <value>\r
-処理を中止しました。このログは {0} に保存されます。\r
-</value>\r
-  </data>\r
-  <data name="LogMessage_TemplateUnknown" xml:space="preserve">\r
-    <value>{{{{0}}}} の識別に失敗しました。{{{{0}}}} は {{1}}名前空間の記事して処理します。({{2}})</value>\r
-  </data>\r
-  <data name="LogMessageTranslation" xml:space="preserve">\r
-    <value> ※キャッシュ</value>\r
-    <comment>対訳表使用時の注釈</comment>\r
-  </data>\r
-  <data name="QuestionMessage_ArticleExist" xml:space="preserve">\r
-    <value>対象の記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。処理を続けますか?</value>\r
-  </data>\r
-  <data name="QuestionMessage_CommonWorkQuestion" xml:space="preserve">\r
-    <value>{0}を行います。よろしいですか?</value>\r
-  </data>\r
-  <data name="QuestionTitle" xml:space="preserve">\r
-    <value>確認</value>\r
-    <comment>確認ダイアログのタイトル</comment>\r
-  </data>\r
-  <data name="RightArrow" xml:space="preserve">\r
-    <value>→</value>\r
-    <comment>右矢印</comment>\r
-  </data>\r
-  <data name="WarningMessageUnformatedBracket" xml:space="preserve">\r
-    <value>括弧の書式は、内部に {0} を含む必要があります。また、括弧書きを使用しない場合は、この項目を空欄にしてください。</value>\r
-    <comment>この{0}はそのまま表示する。</comment>\r
-  </data>\r
-  <data name="WarningMessageNotSelectedSource" xml:space="preserve">\r
-    <value>翻訳元の言語を指定してください。</value>\r
-  </data>\r
-  <data name="WarningMessageNotSelectedTarget" xml:space="preserve">\r
-    <value>翻訳先の言語を指定してください。</value>\r
-  </data>\r
-  <data name="WarningMessageDuplicateCodeColumn" xml:space="preserve">\r
-    <value>言語コードが重複しています。</value>\r
-  </data>\r
-  <data name="WarningMessageEqualsSourceAndTarget" xml:space="preserve">\r
-    <value>翻訳元/先に同じ言語コードが指定されています。</value>\r
-  </data>\r
-  <data name="WarningMessageShortNameColumnOnly" xml:space="preserve">\r
-    <value>略称を指定する場合、呼称も入力してください。</value>\r
-  </data>\r
-  <data name="WarningMessageEmptyCodeColumn" xml:space="preserve">\r
-    <value>言語コードは必須です。</value>\r
-  </data>\r
-  <data name="WarningMessageIgnoreSaveDirectory" xml:space="preserve">\r
-    <value>出力先フォルダが存在しないか無効なパスです。出力先を確認してください。</value>\r
-  </data>\r
-  <data name="WarningMessageIgnoreCacheExpire" xml:space="preserve">\r
-    <value>キャッシュ有効期限には0以上の数値を指定してください。</value>\r
-    <comment>キャッシュ有効期限に不正な値を入れられた場合のメッセージ</comment>\r
-  </data>\r
-  <data name="WarningMessageIgnoreNumericNamespace" xml:space="preserve">\r
-    <value>名前空間のIDには数値を指定してください。</value>\r
-  </data>\r
-  <data name="WarningTitle" xml:space="preserve">\r
-    <value>警告</value>\r
-    <comment>警告ダイアログのタイトル</comment>\r
-  </data>\r
-  <data name="WarningMessageCacheSaveFailed" xml:space="preserve">\r
-    <value>キャッシュの保存に失敗しました。今回参照したページの情報は、アプリケーション終了まで有効です。\r
-\r
-{0}</value>\r
-  </data>\r
-  <data name="HeadingViewHeaderText" xml:space="preserve">\r
-    <value>{0} ({1})</value>\r
-    <comment>見出しの対訳表の表ヘッダー書式</comment>\r
-  </data>\r
-  <data name="WarningMessageUnformatedTimestamp" xml:space="preserve">\r
-    <value>取得日時には日付または空欄を指定してください。\r
-空欄の場合、この置き換えは無期限で有効になります。</value>\r
-    <comment>対訳表 取得日時のバリデートNGメッセージ</comment>\r
-  </data>\r
-  <data name="WarningMessageEmptyTranslationDictionary" xml:space="preserve">\r
-    <value>翻訳元言語、記事名、翻訳先言語は必須です。</value>\r
-    <comment>対訳表 翻訳元、記事名、翻訳先のバリデートNGメッセージ</comment>\r
-  </data>\r
-  <data name="WarningMessageEmptyArticle" xml:space="preserve">\r
-    <value>記事名を指定してください。</value>\r
-  </data>\r
-  <data name="WarningMessageEmptySaveDirectory" xml:space="preserve">\r
-    <value>出力先フォルダを指定してください。</value>\r
-  </data>\r
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="ApplicationName" xml:space="preserve">
+    <value>Wikipedia 翻訳支援ツール Ver{0}.{1:D2}</value>
+    <comment>アプリケーション名メジャーバージョン.マイナーバージョン付き</comment>
+  </data>
+  <data name="ArticleFooter" xml:space="preserve">
+    <value>&lt;!-- {0}、[[:{1}:{2}]]({3}(UTC))より --&gt;</value>
+  </data>
+  <data name="ErrorMessage_TemporayError" xml:space="preserve">
+    <value>一時ファイルの作成に失敗しました。設定ファイルに異常が無いか、また以下のフォルダにファイルが作成可能かを確認してください。</value>
+  </data>
+  <data name="ErrorMessageConfigLordFailed" xml:space="preserve">
+    <value>設定ファイル読み込み時にエラーが発生しました。ファイルが破損している可能性があります。
+
+{0}</value>
+    <comment>設定ファイルの読み込み時にエラーが発生した場合のメッセージ</comment>
+  </data>
+  <data name="ErrorMessageConfigNotFound" xml:space="preserve">
+    <value>設定ファイル{0}が見つかりません。インストールファイルを確認してください。</value>
+    <comment>プログラム付属の設定ファイルが存在しない場合のメッセージ</comment>
+  </data>
+  <data name="ErrorMessageConfigSaveFailed" xml:space="preserve">
+    <value>設定ファイル保存時にエラーが発生しました。現在の設定は保存されていません。
+
+{0}</value>
+    <comment>設定ファイルの保存時にエラーが発生した場合のメッセージ</comment>
+  </data>
+  <data name="ErrorMessageConnectionFailed" xml:space="preserve">
+    <value>サーバーへの接続に失敗しました。ネットワークの設定、またはサーバーの状態を確認してください。({0})</value>
+    <comment>サーバーへの接続失敗</comment>
+  </data>
+  <data name="ErrorMessageDevelopmentError" xml:space="preserve">
+    <value>想定外のエラーが発生しました。プログラムが不安定な状態になった可能性があります。プログラムを再起動してください。
+問題が再発する場合は、設定ファイルを削除するなどしてから、プログラムを再起動してください。
+また、手順や現在の設定を確認し、開発者にご連絡ください。
+
+<エラーの内容>
+{0}
+{1}</value>
+    <comment>プログラムで想定していない何らかのエラーが発生した場合のメッセージ</comment>
+  </data>
+  <data name="ErrorTitle" xml:space="preserve">
+    <value>エラー</value>
+    <comment>エラーダイアログのタイトル</comment>
+  </data>
+  <data name="InformationMessage_DevelopingMethod" xml:space="preserve">
+    <value>現在、{0}には未対応ですm(__)m</value>
+  </data>
+  <data name="InformationTitle" xml:space="preserve">
+    <value>お知らせ</value>
+    <comment>お知らせダイアログのタイトル</comment>
+  </data>
+  <data name="LogMessage_ArticleExistInterWiki" xml:space="preserve">
+    <value>注意:この記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。</value>
+  </data>
+  <data name="LogMessage_ArticleNothing" xml:space="preserve">
+    <value>翻訳元として指定された記事は存在しません。記事名を確認してください。</value>
+  </data>
+  <data name="LogMessage_CheckAndReplaceStart" xml:space="preserve">
+    <value>言語間リンクの探索、見出しの変換を行います</value>
+  </data>
+  <data name="LogMessage_End" xml:space="preserve">
+    <value>
+処理結果を {0} に出力しました。このログは {1} に保存されます。
+</value>
+  </data>
+  <data name="LogMessage_ErrorFileSave" xml:space="preserve">
+    <value>
+ファイル {0} の保存に失敗しました。({1})
+</value>
+  </data>
+  <data name="LogMessage_ErrorURL" xml:space="preserve">
+    <value>要求したURLは {0} です。</value>
+  </data>
+  <data name="LogMessage_GetArticle" xml:space="preserve">
+    <value>{0} より [[{1}]] を取得。</value>
+  </data>
+  <data name="LogMessage_InterWikiNothing" xml:space="preserve">
+    <value>言語間リンク無し</value>
+  </data>
+  <data name="LogMessage_LinkArticleNothing" xml:space="preserve">
+    <value>記事無し</value>
+  </data>
+  <data name="LogMessage_Redirect" xml:space="preserve">
+    <value>リダイレクト</value>
+  </data>
+  <data name="LogMessage_Start" xml:space="preserve">
+    <value>{0}、実行日時 {1}
+
+</value>
+  </data>
+  <data name="LogMessage_Stop" xml:space="preserve">
+    <value>
+処理を中止しました。このログは {0} に保存されます。
+</value>
+  </data>
+  <data name="LogMessage_TemplateUnknown" xml:space="preserve">
+    <value>{{{{0}}}} の識別に失敗しました。{{{{0}}}} は {{1}}名前空間の記事して処理します。({{2}})</value>
+  </data>
+  <data name="LogMessageTranslation" xml:space="preserve">
+    <value> ※キャッシュ</value>
+    <comment>対訳表使用時の注釈</comment>
+  </data>
+  <data name="QuestionMessage_ArticleExist" xml:space="preserve">
+    <value>対象の記事には、翻訳先言語の記事 [[{0}]] への言語間リンクが存在します。処理を続けますか?</value>
+  </data>
+  <data name="QuestionMessage_CommonWorkQuestion" xml:space="preserve">
+    <value>{0}を行います。よろしいですか?</value>
+  </data>
+  <data name="QuestionTitle" xml:space="preserve">
+    <value>確認</value>
+    <comment>確認ダイアログのタイトル</comment>
+  </data>
+  <data name="RightArrow" xml:space="preserve">
+    <value>→</value>
+    <comment>右矢印</comment>
+  </data>
+  <data name="WarningMessageUnformatedBracket" xml:space="preserve">
+    <value>括弧の書式は、内部に {0} を含む必要があります。また、括弧書きを使用しない場合は、この項目を空欄にしてください。</value>
+    <comment>この{0}はそのまま表示する。</comment>
+  </data>
+  <data name="WarningMessageNotSelectedSource" xml:space="preserve">
+    <value>翻訳元の言語を指定してください。</value>
+  </data>
+  <data name="WarningMessageNotSelectedTarget" xml:space="preserve">
+    <value>翻訳先の言語を指定してください。</value>
+  </data>
+  <data name="WarningMessageDuplicateCodeColumn" xml:space="preserve">
+    <value>言語コードが重複しています。</value>
+  </data>
+  <data name="WarningMessageEqualsSourceAndTarget" xml:space="preserve">
+    <value>翻訳元/先に同じ言語コードが指定されています。</value>
+  </data>
+  <data name="WarningMessageShortNameColumnOnly" xml:space="preserve">
+    <value>略称を指定する場合、呼称も入力してください。</value>
+  </data>
+  <data name="WarningMessageEmptyCodeColumn" xml:space="preserve">
+    <value>言語コードは必須です。</value>
+  </data>
+  <data name="WarningMessageIgnoreSaveDirectory" xml:space="preserve">
+    <value>出力先フォルダが存在しないか無効なパスです。出力先を確認してください。</value>
+  </data>
+  <data name="WarningMessageIgnoreCacheExpire" xml:space="preserve">
+    <value>キャッシュ有効期限には0以上の数値を指定してください。</value>
+    <comment>キャッシュ有効期限に不正な値を入れられた場合のメッセージ</comment>
+  </data>
+  <data name="WarningMessageIgnoreNumericNamespace" xml:space="preserve">
+    <value>名前空間のIDには数値を指定してください。</value>
+  </data>
+  <data name="WarningTitle" xml:space="preserve">
+    <value>警告</value>
+    <comment>警告ダイアログのタイトル</comment>
+  </data>
+  <data name="WarningMessageCacheSaveFailed" xml:space="preserve">
+    <value>キャッシュの保存に失敗しました。今回参照したページの情報は、アプリケーション終了まで有効です。
+
+{0}</value>
+  </data>
+  <data name="HeadingViewHeaderText" xml:space="preserve">
+    <value>{0} ({1})</value>
+    <comment>見出しの対訳表の表ヘッダー書式</comment>
+  </data>
+  <data name="WarningMessageUnformatedTimestamp" xml:space="preserve">
+    <value>取得日時には日付または空欄を指定してください。
+空欄の場合、この置き換えは無期限で有効になります。</value>
+    <comment>対訳表 取得日時のバリデートNGメッセージ</comment>
+  </data>
+  <data name="WarningMessageEmptyTranslationDictionary" xml:space="preserve">
+    <value>翻訳元言語、記事名、翻訳先言語は必須です。</value>
+    <comment>対訳表 翻訳元、記事名、翻訳先のバリデートNGメッセージ</comment>
+  </data>
+  <data name="WarningMessageEmptyArticle" xml:space="preserve">
+    <value>記事名を指定してください。</value>
+  </data>
+  <data name="WarningMessageEmptySaveDirectory" xml:space="preserve">
+    <value>出力先フォルダを指定してください。</value>
+  </data>
 </root>
\ No newline at end of file
index db85bff..99f9469 100644 (file)
-//------------------------------------------------------------------------------\r
-// <auto-generated>\r
-//     このコードはツールによって生成されました。\r
-//     ランタイム バージョン:4.0.30319.225\r
-//\r
-//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\r
-//     コードが再生成されるときに損失したりします。\r
-// </auto-generated>\r
-//------------------------------------------------------------------------------\r
-\r
-namespace Honememo.Wptscs.Properties {\r
-    \r
-    \r
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]\r
-    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\r
-        \r
-        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r
-        \r
-        public static Settings Default {\r
-            get {\r
-                return defaultInstance;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("config.xml")]\r
-        public string ConfigurationFile {\r
-            get {\r
-                return ((string)(this["ConfigurationFile"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("WikipediaTranslationSupportTool/{0}.{1:D2}")]\r
-        public string DefaultUserAgent {\r
-            get {\r
-                return ((string)(this["DefaultUserAgent"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("http://{0}.wikipedia.org")]\r
-        public string WikipediaLocation {\r
-            get {\r
-                return ((string)(this["WikipediaLocation"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("")]\r
-        public string SaveDirectory {\r
-            get {\r
-                return ((string)(this["SaveDirectory"]));\r
-            }\r
-            set {\r
-                this["SaveDirectory"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("en")]\r
-        public string LastSelectedSource {\r
-            get {\r
-                return ((string)(this["LastSelectedSource"]));\r
-            }\r
-            set {\r
-                this["LastSelectedSource"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("")]\r
-        public string LastSelectedTarget {\r
-            get {\r
-                return ((string)(this["LastSelectedTarget"]));\r
-            }\r
-            set {\r
-                this["LastSelectedTarget"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("")]\r
-        public string UserAgent {\r
-            get {\r
-                return ((string)(this["UserAgent"]));\r
-            }\r
-            set {\r
-                this["UserAgent"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("")]\r
-        public string Referer {\r
-            get {\r
-                return ((string)(this["Referer"]));\r
-            }\r
-            set {\r
-                this["Referer"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +\r
-            "org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <s" +\r
-            "tring>CURRENTYEAR</string>\r\n  <string>CURRENTMONTH</string>\r\n  <string>CURRENTMO" +\r
-            "NTHNAME</string>\r\n  <string>CURRENTMONTHNAMEGEN</string>\r\n  <string>CURRENTMONTH" +\r
-            "ABBREV</string>\r\n  <string>CURRENTDAY</string>\r\n  <string>CURRENTDAY2</string>\r\n" +\r
-            "  <string>CURRENTDOW</string>\r\n  <string>CURRENTDAYNAME</string>\r\n  <string>CURR" +\r
-            "ENTTIME</string>\r\n  <string>CURRENTHOUR</string>\r\n  <string>CURRENTWEEK</string>" +\r
-            "\r\n  <string>CURRENTTIMESTAMP</string>\r\n  <string>LOCALYEAR</string>\r\n  <string>L" +\r
-            "OCALMONTH</string>\r\n  <string>LOCALMONTHNAME</string>\r\n  <string>LOCALMONTHNAMEG" +\r
-            "EN</string>\r\n  <string>LOCALMONTHABBREV</string>\r\n  <string>LOCALDAY</string>\r\n " +\r
-            " <string>LOCALDAY2</string>\r\n  <string>LOCALDOW</string>\r\n  <string>LOCALDAYNAME" +\r
-            "</string>\r\n  <string>LOCALTIME</string>\r\n  <string>LOCALHOUR</string>\r\n  <string" +\r
-            ">LOCALWEEK</string>\r\n  <string>LOCALTIMESTAMP</string>\r\n  <string>SITENAME</stri" +\r
-            "ng>\r\n  <string>SERVER</string>\r\n  <string>SERVERNAME</string>\r\n  <string>DIRMARK" +\r
-            "</string>\r\n  <string>DIRECTIONMARK</string>\r\n  <string>SCRIPTPATH</string>\r\n  <s" +\r
-            "tring>STYLEPATH</string>\r\n  <string>CURRENTVERSION</string>\r\n  <string>CONTENTLA" +\r
-            "NGUAGE</string>\r\n  <string>CONTENTLANG</string>\r\n  <string>REVISIONID</string>\r\n" +\r
-            "  <string>REVISIONDAY</string>\r\n  <string>REVISIONDAY2</string>\r\n  <string>REVIS" +\r
-            "IONMONTH</string>\r\n  <string>REVISIONYEAR</string>\r\n  <string>REVISIONTIMESTAMP<" +\r
-            "/string>\r\n  <string>REVISIONUSER</string>\r\n  <string>PAGESIZE</string>\r\n  <strin" +\r
-            "g>PROTECTIONLEVEL</string>\r\n  <string>DISPLAYTITLE</string>\r\n  <string>DEFAULTSO" +\r
-            "RT</string>\r\n  <string>DEFAULTSORTKEY</string>\r\n  <string>DEFAULTCATEGORYSORT</s" +\r
-            "tring>\r\n  <string>NUMBEROFPAGES</string>\r\n  <string>NUMBEROFARTICLES</string>\r\n " +\r
-            " <string>NUMBEROFFILES</string>\r\n  <string>NUMBEROFEDITS</string>\r\n  <string>NUM" +\r
-            "BEROFVIEWS</string>\r\n  <string>NUMBEROFUSERS</string>\r\n  <string>NUMBEROFADMINS<" +\r
-            "/string>\r\n  <string>NUMBEROFACTIVEUSERS</string>\r\n  <string>PAGESINCATEGORY</str" +\r
-            "ing>\r\n  <string>PAGESINCAT</string>\r\n  <string>NUMBERINGROUP</string>\r\n  <string" +\r
-            ">NUMINGROUP</string>\r\n  <string>PAGESINNS</string>\r\n  <string>PAGESINNAMESPACE</" +\r
-            "string>\r\n  <string>FULLPAGENAME</string>\r\n  <string>PAGENAME</string>\r\n  <string" +\r
-            ">BASEPAGENAME</string>\r\n  <string>SUBPAGENAME</string>\r\n  <string>SUBJECTPAGENAM" +\r
-            "E</string>\r\n  <string>TALKPAGENAME</string>\r\n  <string>FULLPAGENAMEE</string>\r\n " +\r
-            " <string>PAGENAMEE</string>\r\n  <string>BASEPAGENAMEE</string>\r\n  <string>SUBPAGE" +\r
-            "NAMEE</string>\r\n  <string>SUBJECTPAGENAMEE</string>\r\n  <string>TALKPAGENAMEE</st" +\r
-            "ring>\r\n  <string>NAMESPACE</string>\r\n  <string>SUBJECTSPACE</string>\r\n  <string>" +\r
-            "ARTICLESPACE</string>\r\n  <string>TALKSPACE</string>\r\n  <string>NAMESPACEE</strin" +\r
-            "g>\r\n  <string>SUBJECTSPACEE</string>\r\n  <string>TALKSPACEE</string>\r\n  <string>l" +\r
-            "ocalurl</string>\r\n  <string>fullurl</string>\r\n  <string>filepath</string>\r\n  <st" +\r
-            "ring>urlencode</string>\r\n  <string>anchorencode</string>\r\n  <string>ns</string>\r" +\r
-            "\n  <string>lc</string>\r\n  <string>lcfirst</string>\r\n  <string>uc</string>\r\n  <st" +\r
-            "ring>ucfirst</string>\r\n  <string>formatnum</string>\r\n  <string>#dateformat</stri" +\r
-            "ng>\r\n  <string>#formatdate</string>\r\n  <string>padleft</string>\r\n  <string>padri" +\r
-            "ght</string>\r\n  <string>plural</string>\r\n  <string>grammar</string>\r\n  <string>i" +\r
-            "nt</string>\r\n  <string>#language</string>\r\n  <string>#special</string>\r\n  <strin" +\r
-            "g>#tag</string>\r\n  <string>gender</string>\r\n  <string>groupconvert</string>\r\n</A" +\r
-            "rrayOfString>")]\r
-        public global::System.Collections.Specialized.StringCollection MediaWikiMagicWords {\r
-            get {\r
-                return ((global::System.Collections.Specialized.StringCollection)(this["MediaWikiMagicWords"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("/wiki/Special:Export/{0}")]\r
-        public string MediaWikiExportPath {\r
-            get {\r
-                return ((string)(this["MediaWikiExportPath"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute(" ({0}) ")]\r
-        public string Bracket {\r
-            get {\r
-                return ((string)(this["Bracket"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("#REDIRECT")]\r
-        public string MediaWikiRedirect {\r
-            get {\r
-                return ((string)(this["MediaWikiRedirect"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("10")]\r
-        public int MediaWikiTemplateNamespace {\r
-            get {\r
-                return ((int)(this["MediaWikiTemplateNamespace"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("14")]\r
-        public int MediaWikiCategoryNamespace {\r
-            get {\r
-                return ((int)(this["MediaWikiCategoryNamespace"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("6")]\r
-        public int MediaWikiFileNamespace {\r
-            get {\r
-                return ((int)(this["MediaWikiFileNamespace"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("15.00:00:00")]\r
-        public global::System.TimeSpan CacheExpire {\r
-            get {\r
-                return ((global::System.TimeSpan)(this["CacheExpire"]));\r
-            }\r
-            set {\r
-                this["CacheExpire"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("1.0.0.0")]\r
-        public string ConfigurationCompatible {\r
-            get {\r
-                return ((string)(this["ConfigurationCompatible"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealias" +\r
-            "es")]\r
-        public string MediaWikiNamespacePath {\r
-            get {\r
-                return ((string)(this["MediaWikiNamespacePath"]));\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool IsUpgraded {\r
-            get {\r
-                return ((bool)(this["IsUpgraded"]));\r
-            }\r
-            set {\r
-                this["IsUpgraded"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool IgnoreError {\r
-            get {\r
-                return ((bool)(this["IgnoreError"]));\r
-            }\r
-            set {\r
-                this["IgnoreError"] = value;\r
-            }\r
-        }\r
-    }\r
-}\r
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     このコードはツールによって生成されました。
+//     ランタイム バージョン:4.0.30319.225
+//
+//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+//     コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Honememo.Wptscs.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("config.xml")]
+        public string ConfigurationFile {
+            get {
+                return ((string)(this["ConfigurationFile"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("WikipediaTranslationSupportTool/{0}.{1:D2}")]
+        public string DefaultUserAgent {
+            get {
+                return ((string)(this["DefaultUserAgent"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("http://{0}.wikipedia.org")]
+        public string WikipediaLocation {
+            get {
+                return ((string)(this["WikipediaLocation"]));
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string SaveDirectory {
+            get {
+                return ((string)(this["SaveDirectory"]));
+            }
+            set {
+                this["SaveDirectory"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("en")]
+        public string LastSelectedSource {
+            get {
+                return ((string)(this["LastSelectedSource"]));
+            }
+            set {
+                this["LastSelectedSource"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string LastSelectedTarget {
+            get {
+                return ((string)(this["LastSelectedTarget"]));
+            }
+            set {
+                this["LastSelectedTarget"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string UserAgent {
+            get {
+                return ((string)(this["UserAgent"]));
+            }
+            set {
+                this["UserAgent"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string Referer {
+            get {
+                return ((string)(this["Referer"]));
+            }
+            set {
+                this["Referer"] = value;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +
+            "org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <s" +
+            "tring>CURRENTYEAR</string>\r\n  <string>CURRENTMONTH</string>\r\n  <string>CURRENTMO" +
+            "NTHNAME</string>\r\n  <string>CURRENTMONTHNAMEGEN</string>\r\n  <string>CURRENTMONTH" +
+            "ABBREV</string>\r\n  <string>CURRENTDAY</string>\r\n  <string>CURRENTDAY2</string>\r\n" +
+            "  <string>CURRENTDOW</string>\r\n  <string>CURRENTDAYNAME</string>\r\n  <string>CURR" +
+            "ENTTIME</string>\r\n  <string>CURRENTHOUR</string>\r\n  <string>CURRENTWEEK</string>" +
+            "\r\n  <string>CURRENTTIMESTAMP</string>\r\n  <string>LOCALYEAR</string>\r\n  <string>L" +
+            "OCALMONTH</string>\r\n  <string>LOCALMONTHNAME</string>\r\n  <string>LOCALMONTHNAMEG" +
+            "EN</string>\r\n  <string>LOCALMONTHABBREV</string>\r\n  <string>LOCALDAY</string>\r\n " +
+            " <string>LOCALDAY2</string>\r\n  <string>LOCALDOW</string>\r\n  <string>LOCALDAYNAME" +
+            "</string>\r\n  <string>LOCALTIME</string>\r\n  <string>LOCALHOUR</string>\r\n  <string" +
+            ">LOCALWEEK</string>\r\n  <string>LOCALTIMESTAMP</string>\r\n  <string>SITENAME</stri" +
+            "ng>\r\n  <string>SERVER</string>\r\n  <string>SERVERNAME</string>\r\n  <string>DIRMARK" +
+            "</string>\r\n  <string>DIRECTIONMARK</string>\r\n  <string>SCRIPTPATH</string>\r\n  <s" +
+            "tring>STYLEPATH</string>\r\n  <string>CURRENTVERSION</string>\r\n  <string>CONTENTLA" +
+            "NGUAGE</string>\r\n  <string>CONTENTLANG</string>\r\n  <string>REVISIONID</string>\r\n" +
+            "  <string>REVISIONDAY</string>\r\n  <string>REVISIONDAY2</string>\r\n  <string>REVIS" +
+            "IONMONTH</string>\r\n  <string>REVISIONYEAR</string>\r\n  <string>REVISIONTIMESTAMP<" +
+            "/string>\r\n  <string>REVISIONUSER</string>\r\n  <string>PAGESIZE</string>\r\n  <strin" +
+            "g>PROTECTIONLEVEL</string>\r\n  <string>DISPLAYTITLE</string>\r\n  <string>DEFAULTSO" +
+            "RT</string>\r\n  <string>DEFAULTSORTKEY</string>\r\n  <string>DEFAULTCATEGORYSORT</s" +
+            "tring>\r\n  <string>NUMBEROFPAGES</string>\r\n  <string>NUMBEROFARTICLES</string>\r\n " +
+            " <string>NUMBEROFFILES</string>\r\n  <string>NUMBEROFEDITS</string>\r\n  <string>NUM" +
+            "BEROFVIEWS</string>\r\n  <string>NUMBEROFUSERS</string>\r\n  <string>NUMBEROFADMINS<" +
+            "/string>\r\n  <string>NUMBEROFACTIVEUSERS</string>\r\n  <string>PAGESINCATEGORY</str" +
+            "ing>\r\n  <string>PAGESINCAT</string>\r\n  <string>NUMBERINGROUP</string>\r\n  <string" +
+            ">NUMINGROUP</string>\r\n  <string>PAGESINNS</string>\r\n  <string>PAGESINNAMESPACE</" +
+            "string>\r\n  <string>FULLPAGENAME</string>\r\n  <string>PAGENAME</string>\r\n  <string" +
+            ">BASEPAGENAME</string>\r\n  <string>SUBPAGENAME</string>\r\n  <string>SUBJECTPAGENAM" +
+            "E</string>\r\n  <string>TALKPAGENAME</string>\r\n  <string>FULLPAGENAMEE</string>\r\n " +
+            " <string>PAGENAMEE</string>\r\n  <string>BASEPAGENAMEE</string>\r\n  <string>SUBPAGE" +
+            "NAMEE</string>\r\n  <string>SUBJECTPAGENAMEE</string>\r\n  <string>TALKPAGENAMEE</st" +
+            "ring>\r\n  <string>NAMESPACE</string>\r\n  <string>SUBJECTSPACE</string>\r\n  <string>" +
+            "ARTICLESPACE</string>\r\n  <string>TALKSPACE</string>\r\n  <string>NAMESPACEE</strin" +
+            "g>\r\n  <string>SUBJECTSPACEE</string>\r\n  <string>TALKSPACEE</string>\r\n  <string>l" +
+            "ocalurl</string>\r\n  <string>fullurl</string>\r\n  <string>filepath</string>\r\n  <st" +
+            "ring>urlencode</string>\r\n  <string>anchorencode</string>\r\n  <string>ns</string>\r" +
+            "\n  <string>lc</string>\r\n  <string>lcfirst</string>\r\n  <string>uc</string>\r\n  <st" +
+            "ring>ucfirst</string>\r\n  <string>formatnum</string>\r\n  <string>#dateformat</stri" +
+            "ng>\r\n  <string>#formatdate</string>\r\n  <string>padleft</string>\r\n  <string>padri" +
+            "ght</string>\r\n  <string>plural</string>\r\n  <string>grammar</string>\r\n  <string>i" +
+            "nt</string>\r\n  <string>#language</string>\r\n  <string>#special</string>\r\n  <strin" +
+            "g>#tag</string>\r\n  <string>gender</string>\r\n  <string>groupconvert</string>\r\n</A" +
+            "rrayOfString>")]
+        public global::System.Collections.Specialized.StringCollection MediaWikiMagicWords {
+            get {
+                return ((global::System.Collections.Specialized.StringCollection)(this["MediaWikiMagicWords"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("/wiki/Special:Export/{0}")]
+        public string MediaWikiExportPath {
+            get {
+                return ((string)(this["MediaWikiExportPath"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute(" ({0}) ")]
+        public string Bracket {
+            get {
+                return ((string)(this["Bracket"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("#REDIRECT")]
+        public string MediaWikiRedirect {
+            get {
+                return ((string)(this["MediaWikiRedirect"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("10")]
+        public int MediaWikiTemplateNamespace {
+            get {
+                return ((int)(this["MediaWikiTemplateNamespace"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("14")]
+        public int MediaWikiCategoryNamespace {
+            get {
+                return ((int)(this["MediaWikiCategoryNamespace"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("6")]
+        public int MediaWikiFileNamespace {
+            get {
+                return ((int)(this["MediaWikiFileNamespace"]));
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("15.00:00:00")]
+        public global::System.TimeSpan CacheExpire {
+            get {
+                return ((global::System.TimeSpan)(this["CacheExpire"]));
+            }
+            set {
+                this["CacheExpire"] = value;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("1.0.0.0")]
+        public string ConfigurationCompatible {
+            get {
+                return ((string)(this["ConfigurationCompatible"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealias" +
+            "es")]
+        public string MediaWikiNamespacePath {
+            get {
+                return ((string)(this["MediaWikiNamespacePath"]));
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool IsUpgraded {
+            get {
+                return ((bool)(this["IsUpgraded"]));
+            }
+            set {
+                this["IsUpgraded"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool IgnoreError {
+            get {
+                return ((bool)(this["IgnoreError"]));
+            }
+            set {
+                this["IgnoreError"] = value;
+            }
+        }
+    }
+}
index 27b08aa..a9b0db2 100644 (file)
-<?xml version='1.0' encoding='utf-8'?>\r
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Honememo.Wptscs.Properties" GeneratedClassName="Settings">\r
-  <Profiles />\r
-  <Settings>\r
-    <Setting Name="ConfigurationFile" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">config.xml</Value>\r
-    </Setting>\r
-    <Setting Name="DefaultUserAgent" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">WikipediaTranslationSupportTool/{0}.{1:D2}</Value>\r
-    </Setting>\r
-    <Setting Name="WikipediaLocation" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">http://{0}.wikipedia.org</Value>\r
-    </Setting>\r
-    <Setting Name="SaveDirectory" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)" />\r
-    </Setting>\r
-    <Setting Name="LastSelectedSource" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)">en</Value>\r
-    </Setting>\r
-    <Setting Name="LastSelectedTarget" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)" />\r
-    </Setting>\r
-    <Setting Name="UserAgent" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)" />\r
-    </Setting>\r
-    <Setting Name="Referer" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)" />\r
-    </Setting>\r
-    <Setting Name="MediaWikiMagicWords" Type="System.Collections.Specialized.StringCollection" Scope="Application">\r
-      <Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;\r
-&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;\r
-  &lt;string&gt;CURRENTYEAR&lt;/string&gt;\r
-  &lt;string&gt;CURRENTMONTH&lt;/string&gt;\r
-  &lt;string&gt;CURRENTMONTHNAME&lt;/string&gt;\r
-  &lt;string&gt;CURRENTMONTHNAMEGEN&lt;/string&gt;\r
-  &lt;string&gt;CURRENTMONTHABBREV&lt;/string&gt;\r
-  &lt;string&gt;CURRENTDAY&lt;/string&gt;\r
-  &lt;string&gt;CURRENTDAY2&lt;/string&gt;\r
-  &lt;string&gt;CURRENTDOW&lt;/string&gt;\r
-  &lt;string&gt;CURRENTDAYNAME&lt;/string&gt;\r
-  &lt;string&gt;CURRENTTIME&lt;/string&gt;\r
-  &lt;string&gt;CURRENTHOUR&lt;/string&gt;\r
-  &lt;string&gt;CURRENTWEEK&lt;/string&gt;\r
-  &lt;string&gt;CURRENTTIMESTAMP&lt;/string&gt;\r
-  &lt;string&gt;LOCALYEAR&lt;/string&gt;\r
-  &lt;string&gt;LOCALMONTH&lt;/string&gt;\r
-  &lt;string&gt;LOCALMONTHNAME&lt;/string&gt;\r
-  &lt;string&gt;LOCALMONTHNAMEGEN&lt;/string&gt;\r
-  &lt;string&gt;LOCALMONTHABBREV&lt;/string&gt;\r
-  &lt;string&gt;LOCALDAY&lt;/string&gt;\r
-  &lt;string&gt;LOCALDAY2&lt;/string&gt;\r
-  &lt;string&gt;LOCALDOW&lt;/string&gt;\r
-  &lt;string&gt;LOCALDAYNAME&lt;/string&gt;\r
-  &lt;string&gt;LOCALTIME&lt;/string&gt;\r
-  &lt;string&gt;LOCALHOUR&lt;/string&gt;\r
-  &lt;string&gt;LOCALWEEK&lt;/string&gt;\r
-  &lt;string&gt;LOCALTIMESTAMP&lt;/string&gt;\r
-  &lt;string&gt;SITENAME&lt;/string&gt;\r
-  &lt;string&gt;SERVER&lt;/string&gt;\r
-  &lt;string&gt;SERVERNAME&lt;/string&gt;\r
-  &lt;string&gt;DIRMARK&lt;/string&gt;\r
-  &lt;string&gt;DIRECTIONMARK&lt;/string&gt;\r
-  &lt;string&gt;SCRIPTPATH&lt;/string&gt;\r
-  &lt;string&gt;STYLEPATH&lt;/string&gt;\r
-  &lt;string&gt;CURRENTVERSION&lt;/string&gt;\r
-  &lt;string&gt;CONTENTLANGUAGE&lt;/string&gt;\r
-  &lt;string&gt;CONTENTLANG&lt;/string&gt;\r
-  &lt;string&gt;REVISIONID&lt;/string&gt;\r
-  &lt;string&gt;REVISIONDAY&lt;/string&gt;\r
-  &lt;string&gt;REVISIONDAY2&lt;/string&gt;\r
-  &lt;string&gt;REVISIONMONTH&lt;/string&gt;\r
-  &lt;string&gt;REVISIONYEAR&lt;/string&gt;\r
-  &lt;string&gt;REVISIONTIMESTAMP&lt;/string&gt;\r
-  &lt;string&gt;REVISIONUSER&lt;/string&gt;\r
-  &lt;string&gt;PAGESIZE&lt;/string&gt;\r
-  &lt;string&gt;PROTECTIONLEVEL&lt;/string&gt;\r
-  &lt;string&gt;DISPLAYTITLE&lt;/string&gt;\r
-  &lt;string&gt;DEFAULTSORT&lt;/string&gt;\r
-  &lt;string&gt;DEFAULTSORTKEY&lt;/string&gt;\r
-  &lt;string&gt;DEFAULTCATEGORYSORT&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFPAGES&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFARTICLES&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFFILES&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFEDITS&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFVIEWS&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFUSERS&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFADMINS&lt;/string&gt;\r
-  &lt;string&gt;NUMBEROFACTIVEUSERS&lt;/string&gt;\r
-  &lt;string&gt;PAGESINCATEGORY&lt;/string&gt;\r
-  &lt;string&gt;PAGESINCAT&lt;/string&gt;\r
-  &lt;string&gt;NUMBERINGROUP&lt;/string&gt;\r
-  &lt;string&gt;NUMINGROUP&lt;/string&gt;\r
-  &lt;string&gt;PAGESINNS&lt;/string&gt;\r
-  &lt;string&gt;PAGESINNAMESPACE&lt;/string&gt;\r
-  &lt;string&gt;FULLPAGENAME&lt;/string&gt;\r
-  &lt;string&gt;PAGENAME&lt;/string&gt;\r
-  &lt;string&gt;BASEPAGENAME&lt;/string&gt;\r
-  &lt;string&gt;SUBPAGENAME&lt;/string&gt;\r
-  &lt;string&gt;SUBJECTPAGENAME&lt;/string&gt;\r
-  &lt;string&gt;TALKPAGENAME&lt;/string&gt;\r
-  &lt;string&gt;FULLPAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;PAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;BASEPAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;SUBPAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;SUBJECTPAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;TALKPAGENAMEE&lt;/string&gt;\r
-  &lt;string&gt;NAMESPACE&lt;/string&gt;\r
-  &lt;string&gt;SUBJECTSPACE&lt;/string&gt;\r
-  &lt;string&gt;ARTICLESPACE&lt;/string&gt;\r
-  &lt;string&gt;TALKSPACE&lt;/string&gt;\r
-  &lt;string&gt;NAMESPACEE&lt;/string&gt;\r
-  &lt;string&gt;SUBJECTSPACEE&lt;/string&gt;\r
-  &lt;string&gt;TALKSPACEE&lt;/string&gt;\r
-  &lt;string&gt;localurl&lt;/string&gt;\r
-  &lt;string&gt;fullurl&lt;/string&gt;\r
-  &lt;string&gt;filepath&lt;/string&gt;\r
-  &lt;string&gt;urlencode&lt;/string&gt;\r
-  &lt;string&gt;anchorencode&lt;/string&gt;\r
-  &lt;string&gt;ns&lt;/string&gt;\r
-  &lt;string&gt;lc&lt;/string&gt;\r
-  &lt;string&gt;lcfirst&lt;/string&gt;\r
-  &lt;string&gt;uc&lt;/string&gt;\r
-  &lt;string&gt;ucfirst&lt;/string&gt;\r
-  &lt;string&gt;formatnum&lt;/string&gt;\r
-  &lt;string&gt;#dateformat&lt;/string&gt;\r
-  &lt;string&gt;#formatdate&lt;/string&gt;\r
-  &lt;string&gt;padleft&lt;/string&gt;\r
-  &lt;string&gt;padright&lt;/string&gt;\r
-  &lt;string&gt;plural&lt;/string&gt;\r
-  &lt;string&gt;grammar&lt;/string&gt;\r
-  &lt;string&gt;int&lt;/string&gt;\r
-  &lt;string&gt;#language&lt;/string&gt;\r
-  &lt;string&gt;#special&lt;/string&gt;\r
-  &lt;string&gt;#tag&lt;/string&gt;\r
-  &lt;string&gt;gender&lt;/string&gt;\r
-  &lt;string&gt;groupconvert&lt;/string&gt;\r
-&lt;/ArrayOfString&gt;</Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiExportPath" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">/wiki/Special:Export/{0}</Value>\r
-    </Setting>\r
-    <Setting Name="Bracket" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)"> ({0}) </Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiRedirect" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">#REDIRECT</Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiTemplateNamespace" Type="System.Int32" Scope="Application">\r
-      <Value Profile="(Default)">10</Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiCategoryNamespace" Type="System.Int32" Scope="Application">\r
-      <Value Profile="(Default)">14</Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiFileNamespace" Type="System.Int32" Scope="Application">\r
-      <Value Profile="(Default)">6</Value>\r
-    </Setting>\r
-    <Setting Name="CacheExpire" Type="System.TimeSpan" Scope="User">\r
-      <Value Profile="(Default)">15.00:00:00</Value>\r
-    </Setting>\r
-    <Setting Name="ConfigurationCompatible" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">1.0.0.0</Value>\r
-    </Setting>\r
-    <Setting Name="MediaWikiNamespacePath" Type="System.String" Scope="Application">\r
-      <Value Profile="(Default)">/w/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|namespacealiases</Value>\r
-    </Setting>\r
-    <Setting Name="IsUpgraded" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
-    </Setting>\r
-    <Setting Name="IgnoreError" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
-    </Setting>\r
-  </Settings>\r
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Honememo.Wptscs.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="ConfigurationFile" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">config.xml</Value>
+    </Setting>
+    <Setting Name="DefaultUserAgent" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">WikipediaTranslationSupportTool/{0}.{1:D2}</Value>
+    </Setting>
+    <Setting Name="WikipediaLocation" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">http://{0}.wikipedia.org</Value>
+    </Setting>
+    <Setting Name="SaveDirectory" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="LastSelectedSource" Type="System.String" Scope="User">
+      <Value Profile="(Default)">en</Value>
+    </Setting>
+    <Setting Name="LastSelectedTarget" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="UserAgent" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="Referer" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="MediaWikiMagicWords" Type="System.Collections.Specialized.StringCollection" Scope="Application">
+      <Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;string&gt;CURRENTYEAR&lt;/string&gt;
+  &lt;string&gt;CURRENTMONTH&lt;/string&gt;
+  &lt;string&gt;CURRENTMONTHNAME&lt;/string&gt;
+  &lt;string&gt;CURRENTMONTHNAMEGEN&lt;/string&gt;
+  &lt;string&gt;CURRENTMONTHABBREV&lt;/string&gt;
+  &lt;string&gt;CURRENTDAY&lt;/string&gt;
+  &lt;string&gt;CURRENTDAY2&lt;/string&gt;
+  &lt;string&gt;CURRENTDOW&lt;/string&gt;
+  &lt;string&gt;CURRENTDAYNAME&lt;/string&gt;
+  &lt;string&gt;CURRENTTIME&lt;/string&gt;
+  &lt;string&gt;CURRENTHOUR&lt;/string&gt;
+  &lt;string&gt;CURRENTWEEK&lt;/string&gt;
+  &lt;string&gt;CURRENTTIMESTAMP&lt;/string&gt;
+  &lt;string&gt;LOCALYEAR&lt;/string&gt;
+  &lt;string&gt;LOCALMONTH&lt;/string&gt;
+  &lt;string&gt;LOCALMONTHNAME&lt;/string&gt;
+  &lt;string&gt;LOCALMONTHNAMEGEN&lt;/string&gt;
+  &lt;string&gt;LOCALMONTHABBREV&lt;/string&gt;
+  &lt;string&gt;LOCALDAY&lt;/string&gt;
+  &lt;string&gt;LOCALDAY2&lt;/string&gt;
+  &lt;string&gt;LOCALDOW&lt;/string&gt;
+  &lt;string&gt;LOCALDAYNAME&lt;/string&gt;
+  &lt;string&gt;LOCALTIME&lt;/string&gt;
+  &lt;string&gt;LOCALHOUR&lt;/string&gt;
+  &lt;string&gt;LOCALWEEK&lt;/string&gt;
+  &lt;string&gt;LOCALTIMESTAMP&lt;/string&gt;
+  &lt;string&gt;SITENAME&lt;/string&gt;
+  &lt;string&gt;SERVER&lt;/string&gt;
+  &lt;string&gt;SERVERNAME&lt;/string&gt;
+  &lt;string&gt;DIRMARK&lt;/string&gt;
+  &lt;string&gt;DIRECTIONMARK&lt;/string&gt;
+  &lt;string&gt;SCRIPTPATH&lt;/string&gt;
+  &lt;string&gt;STYLEPATH&lt;/string&gt;
+  &lt;string&gt;CURRENTVERSION&lt;/string&gt;
+  &lt;string&gt;CONTENTLANGUAGE&lt;/string&gt;
+  &lt;string&gt;CONTENTLANG&lt;/string&gt;
+  &lt;string&gt;REVISIONID&lt;/string&gt;
+  &lt;string&gt;REVISIONDAY&lt;/string&gt;
+  &lt;string&gt;REVISIONDAY2&lt;/string&gt;
+  &lt;string&gt;REVISIONMONTH&lt;/string&gt;
+  &lt;string&gt;REVISIONYEAR&lt;/string&gt;
+  &lt;string&gt;REVISIONTIMESTAMP&lt;/string&gt;
+  &lt;string&gt;REVISIONUSER&lt;/string&gt;
+  &lt;string&gt;PAGESIZE&lt;/string&gt;
+  &lt;string&gt;PROTECTIONLEVEL&lt;/string&gt;
+  &lt;string&gt;DISPLAYTITLE&lt;/string&gt;
+  &lt;string&gt;DEFAULTSORT&lt;/string&gt;
+  &lt;string&gt;DEFAULTSORTKEY&lt;/string&gt;
+  &lt;string&gt;DEFAULTCATEGORYSORT&lt;/string&gt;
+  &lt;string&gt;NUMBEROFPAGES&lt;/string&gt;
+  &lt;string&gt;NUMBEROFARTICLES&lt;/string&gt;
+  &lt;string&gt;NUMBEROFFILES&lt;/string&gt;
+  &lt;string&gt;NUMBEROFEDITS&lt;/string&gt;
+  &lt;string&gt;NUMBEROFVIEWS&lt;/string&gt;
+  &lt;string&gt;NUMBEROFUSERS&lt;/string&gt;
+  &lt;string&gt;NUMBEROFADMINS&lt;/string&gt;
+  &lt;string&gt;NUMBEROFACTIVEUSERS&lt;/string&gt;
+  &lt;string&gt;PAGESINCATEGORY&lt;/string&gt;
+  &lt;string&gt;PAGESINCAT&lt;/string&gt;
+  &lt;string&gt;NUMBERINGROUP&lt;/string&gt;
+  &lt;string&gt;NUMINGROUP&lt;/string&gt;
+  &lt;string&gt;PAGESINNS&lt;/string&gt;
+  &lt;string&gt;PAGESINNAMESPACE&lt;/string&gt;
+  &lt;string&gt;FULLPAGENAME&lt;/string&gt;
+  &lt;string&gt;PAGENAME&lt;/string&gt;
+  &lt;string&gt;BASEPAGENAME&lt;/string&gt;
+  &lt;string&gt;SUBPAGENAME&lt;/string&gt;
+  &lt;string&gt;SUBJECTPAGENAME&lt;/string&gt;
+  &lt;string&gt;TALKPAGENAME&lt;/string&gt;
+  &lt;string&gt;FULLPAGENAMEE&lt;/string&gt;
+  &lt;string&gt;PAGENAMEE&lt;/string&gt;
+  &lt;string&gt;BASEPAGENAMEE&lt;/string&gt;
+  &lt;string&gt;SUBPAGENAMEE&lt;/string&gt;
+  &lt;string&gt;SUBJECTPAGENAMEE&lt;/string&gt;
+  &lt;string&gt;TALKPAGENAMEE&lt;/string&gt;
+  &lt;string&gt;NAMESPACE&lt;/string&gt;
+  &lt;string&gt;SUBJECTSPACE&lt;/string&gt;
+  &lt;string&gt;ARTICLESPACE&lt;/string&gt;
+  &lt;string&gt;TALKSPACE&lt;/string&gt;
+  &lt;string&gt;NAMESPACEE&lt;/string&gt;
+  &lt;string&gt;SUBJECTSPACEE&lt;/string&gt;
+  &lt;string&gt;TALKSPACEE&lt;/string&gt;
+  &lt;string&gt;localurl&lt;/string&gt;
+  &lt;string&gt;fullurl&lt;/string&gt;
+  &lt;string&gt;filepath&lt;/string&gt;
+  &lt;string&gt;urlencode&lt;/string&gt;
+  &lt;string&gt;anchorencode&lt;/string&gt;
+  &lt;string&gt;ns&lt;/string&gt;
+  &lt;string&gt;lc&lt;/string&gt;
+  &lt;string&gt;lcfirst&lt;/string&gt;
+  &lt;string&gt;uc&lt;/string&gt;
+  &lt;string&gt;ucfirst&lt;/string&gt;
+  &lt;string&gt;formatnum&lt;/string&gt;
+  &lt;string&gt;#dateformat&lt;/string&gt;
+  &lt;string&gt;#formatdate&lt;/string&gt;
+  &lt;string&gt;padleft&lt;/string&gt;
+  &lt;string&gt;padright&lt;/string&gt;
+  &lt;string&gt;plural&lt;/string&gt;
+  &lt;string&gt;grammar&lt;/string&gt;
+  &lt;string&gt;int&lt;/string&gt;
+  &lt;string&gt;#language&lt;/string&gt;
+  &lt;string&gt;#special&lt;/string&gt;
+  &lt;string&gt;#tag&lt;/string&gt;
+  &lt;string&gt;gender&lt;/string&gt;
+  &lt;string&gt;groupconvert&lt;/string&gt;
+&lt;/ArrayOfString&gt;</Value>
+    </Setting>
+    <Setting Name="MediaWikiExportPath" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">/wiki/Special:Export/{0}</Value>
+    </Setting>
+    <Setting Name="Bracket" Type="System.String" Scope="Application">
+      <Value Profile="(Default)"> ({0}) </Value>
+    </Setting>
+    <Setting Name="MediaWikiRedirect" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">#REDIRECT</Value>
+    </Setting>
+    <Setting Name="MediaWikiTemplateNamespace" Type="System.Int32" Scope="Application">
+      <Value Profile="(Default)">10</Value>
+    </Setting>
+    <Setting Name="MediaWikiCategoryNamespace" Type="System.Int32" Scope="Application">
+      <Value Profile="(Default)">14</Value>
+    </Setting>
+    <Setting Name="MediaWikiFileNamespace" Type="System.Int32" Scope="Application">
+      <Value Profile="(Default)">6</Value>
+    </Setting>
+    <Setting Name="CacheExpire" Type="System.TimeSpan" Scope="User">
+      <Value Profile="(Default)">15.00:00:00</Value>
+    </Setting>
+    <Setting Name="ConfigurationCompatible" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">1.0.0.0</Value>
+    </Setting>
+    <Setting Name="MediaWikiNamespacePath" Type="System.String" Scope="Application">
+      <Value Profile="(Default)">/w/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|namespacealiases</Value>
+    </Setting>
+    <Setting Name="IsUpgraded" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="IgnoreError" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+  </Settings>
 </SettingsFile>
\ No newline at end of file
index 63a1449..ac46eb1 100644 (file)
@@ -1,99 +1,99 @@
-=====================================================================\r
-【タイトル】 Wikipedia 翻訳支援ツール\r
-【ファイル】 wptscs101.zip\r
-【作成月日】 2011/10/5\r
-【制 作 者】 Honeplus\r
-【動作環境】 Windows Vista x64での動作を確認。要.NET Framework 4.0\r
-【配布形態】 修正BSDライセンス\r
-【HomePage】 http://honeplus.blog50.fc2.com/\r
-=====================================================================\r
-\r
-・概要\r
-Wikipediaでの言語間翻訳をサポートするためのツールです。\r
-指定されたWikipediaの記事に存在する内部リンク先を確認し、\r
-その言語間リンクを取得します。\r
-また、登録されていれば、見出しも変換します。\r
-\r
-※Wikipedia以外でも同じシステムのサイト(例えばWikipedia姉妹サイト)\r
-  なら使えるかもしれませんが、未確認です。\r
-\r
-\r
-・インストール方法\r
-適当なフォルダに展開してください。\r
-展開して出てくる以下のファイルが、最低限必要なファイルです。他は消しても可。\r
-\r
-wptscs.exe        : 実行ファイル\r
-wptscs.exe.config : デフォルト値やプログラム的な設定ファイル\r
-config.xml        : Wikipediaの各サーバーに関する設定ファイル\r
-\r
-アプリケーション上で設定した内容は、上記設定ファイルには反映されません。\r
-ユーザーごとのフォルダに出力されます。\r
-(Microsoftがそうしろっていうから・・・。)\r
-設定ファイルを直接修正、または削除して初期値に戻したい場合は、\r
-下記のようなパスにあるファイルを更新してください。\r
-\r
-C:\Users\[ユーザー名]\AppData\Roaming\Honememo\Wikipedia 翻訳支援ツール\[バージョン番号]\config.xml\r
-C:\Users\[ユーザー名]\AppData\Local\Honememo\Wikipedia 翻訳支援ツール\[バージョン番号]\user.config\r
-\r
-\r
-・アンインストール方法\r
-展開したファイルと必要なら上記設定ファイルを削除してください。レジストリ等は一切いじりません。\r
-\r
-\r
-・使い方\r
-翻訳元/先言語と、処理結果の出力先フォルダを指定してから、翻訳したい翻訳元記事名を入力して実行してください。\r
-\r
-設定画面については、通常は触る必要はないです。\r
-言語間リンクが貼られていない記事の対応パターン登録や、キャッシュの確認、\r
-言語コードの登録や、見出しの変換パターンの設定ができます。\r
-設定の内容などは、ツールチップと既存の値を見れば概要はつかめるのではないかと思います。\r
-\r
-なお、このプログラムはあくまで「翻訳支援ツール」です。\r
-出力された文章は、その後Wikipediaの編集画面やプレビューなりで本格的に修正されることを前提としています。\r
-間違っても、そのままWikipediaに投稿するなどしないでください。\r
-また、当プログラムではWikipediaへの書き込みは一切行いません。\r
-\r
-※テンプレート等の複雑な書式の記事で使用した場合、一部が正常に処理されない可能性あります。\r
-  これらの記事で使用する際は、処理結果に異常が無いか注意しながらご利用ください。\r
-\r
-\r
-・ソースについて\r
-src.zipにソースファイルをまとめています。開発環境はVisual C# 2010 Expressです。\r
-その他外部ツールとしてテスト自動化ツールのnUnitと、コーディングスタイルチェック用のStyleCopを使用しています。\r
-\r
-\r
-・その他\r
-このプログラムは修正BSDライセンスに基づいたフリーソフトウェアで、無保証です。\r
-このプログラムを利用して何らかの被害をこうむっても、作者は一切責任を負いません。\r
-またサポートする保証もありません。\r
-このプログラムの変更・再配布・流用はご自由にどうぞ。\r
-\r
-修正BSDライセンスの文面はこちら(日本語版)\r
-http://sourceforge.jp/projects/opensource/wiki/licenses%2Fnew_BSD_license\r
-※ 既存のライセンスを使っていますが、要は「好きに使ってね。責任取らないけど。」ということです。\r
-\r
-\r
-また、ソース中にNUnitのテストデータとしてWikipediaより取得したXMLを同梱しています。\r
-これらファイル内の著作物の扱いについては、日本語版/英語版の各Wikipediaのライセンスに従ってください。\r
-\r
-\r
-・更新履歴\r
-Ver0.80  2010/09/18 開発環境/言語をVisual Studio 2005のC++/CLI→Visual C# 2010 Expressに移行。\r
-                    ソースも全面的に見直し(ただし現在は古いコードが多々残った状態)。\r
-                                       設定画面を全体的に変更。記事の対応パターンを登録できるよう対応。\r
-                                       キャッシュ状況も見えるように変更。\r
-Ver0.90  2010/09/27 Template:Documentationが使われているページに対応。\r
-                    無駄に遅くなっていた処理を改善。その他細かい部分を改良/修正。\r
-Ver1.00  2011/04/22 Wikipediaのバージョンアップごとに設定ファイルを直さなくて済むよう対処。\r
-                    無駄に遅くなっていた処理を改善。\r
-                                       設定画面のツールチップや入力値チェックを整備。\r
-                                       [[ファイル:~]]→[[File:~]]も変換するよう対応。\r
-                                       [[Apollo&nbsp;17]]のように特殊文字が入っているリンクを処理できるよう修正。\r
-                                       HTMLタグの解析で正規表現の構文エラーになる可能性があったのを修正。\r
-                                       config.xmlの日英以外の言語の設定を精査・補填。\r
-Ver1.01  2011/10/05 MediaWikiのバージョンアップに伴いAPIの仕様が変わったため対応。\r
-\r
-\r
-・今後の目標\r
-言語間リンクがなかった記事名を{{仮リンク}}とかに置き換えたい。\r
-汚いソースをがっつり作り直す(エンバグ多数のため挫折中)。\r
+=====================================================================
+【タイトル】 Wikipedia 翻訳支援ツール
+【ファイル】 wptscs101.zip
+【作成月日】 2011/10/5
+【制 作 者】 Honeplus
+【動作環境】 Windows Vista x64での動作を確認。要.NET Framework 4.0
+【配布形態】 修正BSDライセンス
+【HomePage】 http://honeplus.blog50.fc2.com/
+=====================================================================
+
+・概要
+Wikipediaでの言語間翻訳をサポートするためのツールです。
+指定されたWikipediaの記事に存在する内部リンク先を確認し、
+その言語間リンクを取得します。
+また、登録されていれば、見出しも変換します。
+
+※Wikipedia以外でも同じシステムのサイト(例えばWikipedia姉妹サイト)
+  なら使えるかもしれませんが、未確認です。
+
+
+・インストール方法
+適当なフォルダに展開してください。
+展開して出てくる以下のファイルが、最低限必要なファイルです。他は消しても可。
+
+wptscs.exe        : 実行ファイル
+wptscs.exe.config : デフォルト値やプログラム的な設定ファイル
+config.xml        : Wikipediaの各サーバーに関する設定ファイル
+
+アプリケーション上で設定した内容は、上記設定ファイルには反映されません。
+ユーザーごとのフォルダに出力されます。
+(Microsoftがそうしろっていうから・・・。)
+設定ファイルを直接修正、または削除して初期値に戻したい場合は、
+下記のようなパスにあるファイルを更新してください。
+
+C:\Users\[ユーザー名]\AppData\Roaming\Honememo\Wikipedia 翻訳支援ツール\[バージョン番号]\config.xml
+C:\Users\[ユーザー名]\AppData\Local\Honememo\Wikipedia 翻訳支援ツール\[バージョン番号]\user.config
+
+
+・アンインストール方法
+展開したファイルと必要なら上記設定ファイルを削除してください。レジストリ等は一切いじりません。
+
+
+・使い方
+翻訳元/先言語と、処理結果の出力先フォルダを指定してから、翻訳したい翻訳元記事名を入力して実行してください。
+
+設定画面については、通常は触る必要はないです。
+言語間リンクが貼られていない記事の対応パターン登録や、キャッシュの確認、
+言語コードの登録や、見出しの変換パターンの設定ができます。
+設定の内容などは、ツールチップと既存の値を見れば概要はつかめるのではないかと思います。
+
+なお、このプログラムはあくまで「翻訳支援ツール」です。
+出力された文章は、その後Wikipediaの編集画面やプレビューなりで本格的に修正されることを前提としています。
+間違っても、そのままWikipediaに投稿するなどしないでください。
+また、当プログラムではWikipediaへの書き込みは一切行いません。
+
+※テンプレート等の複雑な書式の記事で使用した場合、一部が正常に処理されない可能性あります。
+  これらの記事で使用する際は、処理結果に異常が無いか注意しながらご利用ください。
+
+
+・ソースについて
+src.zipにソースファイルをまとめています。開発環境はVisual C# 2010 Expressです。
+その他外部ツールとしてテスト自動化ツールのnUnitと、コーディングスタイルチェック用のStyleCopを使用しています。
+
+
+・その他
+このプログラムは修正BSDライセンスに基づいたフリーソフトウェアで、無保証です。
+このプログラムを利用して何らかの被害をこうむっても、作者は一切責任を負いません。
+またサポートする保証もありません。
+このプログラムの変更・再配布・流用はご自由にどうぞ。
+
+修正BSDライセンスの文面はこちら(日本語版)
+http://sourceforge.jp/projects/opensource/wiki/licenses%2Fnew_BSD_license
+※ 既存のライセンスを使っていますが、要は「好きに使ってね。責任取らないけど。」ということです。
+
+
+また、ソース中にNUnitのテストデータとしてWikipediaより取得したXMLを同梱しています。
+これらファイル内の著作物の扱いについては、日本語版/英語版の各Wikipediaのライセンスに従ってください。
+
+
+・更新履歴
+Ver0.80  2010/09/18 開発環境/言語をVisual Studio 2005のC++/CLI→Visual C# 2010 Expressに移行。
+                    ソースも全面的に見直し(ただし現在は古いコードが多々残った状態)。
+                                       設定画面を全体的に変更。記事の対応パターンを登録できるよう対応。
+                                       キャッシュ状況も見えるように変更。
+Ver0.90  2010/09/27 Template:Documentationが使われているページに対応。
+                    無駄に遅くなっていた処理を改善。その他細かい部分を改良/修正。
+Ver1.00  2011/04/22 Wikipediaのバージョンアップごとに設定ファイルを直さなくて済むよう対処。
+                    無駄に遅くなっていた処理を改善。
+                                       設定画面のツールチップや入力値チェックを整備。
+                                       [[ファイル:~]]→[[File:~]]も変換するよう対応。
+                                       [[Apollo&nbsp;17]]のように特殊文字が入っているリンクを処理できるよう修正。
+                                       HTMLタグの解析で正規表現の構文エラーになる可能性があったのを修正。
+                                       config.xmlの日英以外の言語の設定を精査・補填。
+Ver1.01  2011/10/05 MediaWikiのバージョンアップに伴いAPIの仕様が変わったため対応。
+
+
+・今後の目標
+言語間リンクがなかった記事名を{{仮リンク}}とかに置き換えたい。
+汚いソースをがっつり作り直す(エンバグ多数のため挫折中)。
index bc09f6c..c418d1e 100644 (file)
@@ -1,56 +1,56 @@
-// ================================================================================================\r
-// <summary>\r
-//      Wikipedia翻訳支援ツールの設定アクセス用ソース</summary>\r
-//\r
-// <copyright file="Settings.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Properties\r
-{    \r
-    // このクラスでは設定クラスでの特定のイベントを処理することができます:\r
-    //  SettingChanging イベントは、設定値が変更される前に発生します。\r
-    //  PropertyChanged イベントは、設定値が変更された後に発生します。\r
-    //  SettingsLoaded イベントは、設定値が読み込まれた後に発生します。\r
-    //  SettingsSaving イベントは、設定値が保存される前に発生します。\r
-\r
-    /// <summary>\r
-    /// Wikipedia翻訳支援ツールの設定アクセス用クラスです。\r
-    /// </summary>\r
-    internal sealed partial class Settings\r
-    {\r
-        /// <summary>\r
-        /// コンストラクタ。\r
-        /// </summary>\r
-        public Settings()\r
-        {\r
-            // // 設定の保存と変更のイベント ハンドラを追加するには、以下の行のコメントを解除します:\r
-            //\r
-            // this.SettingChanging += this.SettingChangingEventHandler;\r
-            //\r
-            // this.SettingsSaving += this.SettingsSavingEventHandler;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 設定値が変更される前の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e)\r
-        {\r
-            // SettingChangingEvent イベントを処理するコードをここに追加してください。\r
-        }\r
-        \r
-        /// <summary>\r
-        /// 設定値が保存される前の処理。\r
-        /// </summary>\r
-        /// <param name="sender">イベント発生オブジェクト。</param>\r
-        /// <param name="e">発生したイベント。</param>\r
-        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e)\r
-        {\r
-            // SettingsSaving イベントを処理するコードをここに追加してください。\r
-        }\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Wikipedia翻訳支援ツールの設定アクセス用ソース</summary>
+//
+// <copyright file="Settings.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Properties
+{    
+    // このクラスでは設定クラスでの特定のイベントを処理することができます:
+    //  SettingChanging イベントは、設定値が変更される前に発生します。
+    //  PropertyChanged イベントは、設定値が変更された後に発生します。
+    //  SettingsLoaded イベントは、設定値が読み込まれた後に発生します。
+    //  SettingsSaving イベントは、設定値が保存される前に発生します。
+
+    /// <summary>
+    /// Wikipedia翻訳支援ツールの設定アクセス用クラスです。
+    /// </summary>
+    internal sealed partial class Settings
+    {
+        /// <summary>
+        /// コンストラクタ。
+        /// </summary>
+        public Settings()
+        {
+            // // 設定の保存と変更のイベント ハンドラを追加するには、以下の行のコメントを解除します:
+            //
+            // this.SettingChanging += this.SettingChangingEventHandler;
+            //
+            // this.SettingsSaving += this.SettingsSavingEventHandler;
+        }
+
+        /// <summary>
+        /// 設定値が変更される前の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e)
+        {
+            // SettingChangingEvent イベントを処理するコードをここに追加してください。
+        }
+        
+        /// <summary>
+        /// 設定値が保存される前の処理。
+        /// </summary>
+        /// <param name="sender">イベント発生オブジェクト。</param>
+        /// <param name="e">発生したイベント。</param>
+        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e)
+        {
+            // SettingsSaving イベントを処理するコードをここに追加してください。
+        }
+    }
+}
index ee364e7..0341531 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Windows処理に関するユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="FormUtils.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using System.Windows.Forms;\r
-\r
-    // ※ プロパティを含むので、そのまま他のプロジェクトに流用することはできない\r
-    using Honememo.Wptscs.Properties;\r
-\r
-    /// <summary>\r
-    /// Windows処理に関するユーティリティクラスです。\r
-    /// </summary>\r
-    public static class FormUtils\r
-    {\r
-        #region リソース関連\r
-\r
-        /// <summary>\r
-        /// バージョン情報を含んだアプリケーション名を返す。\r
-        /// </summary>\r
-        /// <returns>アプリケーション名</returns>\r
-        public static string ApplicationName()\r
-        {\r
-            // アセンブリからバージョン情報を取得し、書式化して返す\r
-            // ビルド番号・リビジョンは無視\r
-            // ※例外なし。もし万が一発生する場合はそのまま投げる\r
-            Version ver = Assembly.GetExecutingAssembly().GetName().Version;\r
-            return String.Format(Resources.ApplicationName, ver.Major, ver.Minor);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたファイルを UserAppDataPath\r
-        /// → 旧バージョンのUserAppDataPath\r
-        /// → StartupPath の順に探索し、その際のパスを返す。\r
-        /// </summary>\r
-        /// <param name="fileName">ファイル名。</param>\r
-        /// <param name="compatible">探索する旧バージョンの最大。</param>\r
-        /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>\r
-        /// <remarks>アセンブリ名が変わっている場合、旧バージョンは探索不可。</remarks>\r
-        public static string SearchUserAppData(string fileName, string compatible)\r
-        {\r
-            // 現在の UserAppDataPath を探索\r
-            string path = Path.Combine(Application.UserAppDataPath, fileName);\r
-            if (File.Exists(path))\r
-            {\r
-                return path;\r
-            }\r
-\r
-            // 可能であれば、旧バージョンの UserAppDataPath を探索\r
-            if (!String.IsNullOrEmpty(compatible))\r
-            {\r
-                // UserAppDataPath は\r
-                // <ベースパス>\<CompanyName>\<ProductName>\<ProductVersion>\r
-                // という構成のはずなので、一つ上のフォルダから自分より前のフォルダを探索\r
-                string parent = Path.GetDirectoryName(Application.UserAppDataPath);\r
-                if (!String.IsNullOrEmpty(parent))\r
-                {\r
-                    // 現在のバージョンのフォルダ名\r
-                    string now = Path.GetFileName(Application.UserAppDataPath);\r
-\r
-                    // 同じ階層のフォルダをすべて取得し、降順にソート\r
-                    string[] directories = Directory.GetDirectories(parent);\r
-                    Array.Sort(directories);\r
-                    Array.Reverse(directories);\r
-\r
-                    // ファイルが見つかるまで探索\r
-                    foreach (string dir in directories)\r
-                    {\r
-                        string ver = Path.GetFileName(dir);\r
-                        if (compatible.CompareTo(ver) <= 0 && ver.CompareTo(now) < 0)\r
-                        {\r
-                            path = Path.Combine(dir, fileName);\r
-                            if (File.Exists(path))\r
-                            {\r
-                                return path;\r
-                            }\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-\r
-            // どこにも無い場合は、exeと同じフォルダを探索\r
-            path = Path.Combine(Application.StartupPath, fileName);\r
-            if (File.Exists(path))\r
-            {\r
-                return path;\r
-            }\r
-\r
-            return null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されたファイルを UserAppDataPath\r
-        /// → StartupPath の順に探索し、その際のパスを返す。\r
-        /// </summary>\r
-        /// <param name="fileName">ファイル名。</param>\r
-        /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>\r
-        public static string SearchUserAppData(string fileName)\r
-        {\r
-            // オーバーロードメソッドをコール\r
-            return FormUtils.SearchUserAppData(fileName, null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 文字列中のファイル名に使用できない文字を「_」に置換。\r
-        /// </summary>\r
-        /// <param name="fileName">ファイル名。</param>\r
-        /// <returns>置換後のファイル名。</returns>\r
-        public static string ReplaceInvalidFileNameChars(string fileName)\r
-        {\r
-            // 渡された文字列にファイル名に使えない文字が含まれている場合、_ に置き換える\r
-            string result = fileName;\r
-            char[] unuseChars = Path.GetInvalidFileNameChars();\r
-            foreach (char c in unuseChars)\r
-            {\r
-                result = result.Replace(c, '_');\r
-            }\r
-\r
-            return result;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region null値許容メソッド\r
-\r
-        /// <summary>\r
-        /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に空の文字列を返す<c>ToString</c>。\r
-        /// </summary>\r
-        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
-        /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
-        public static string ToString(DataGridViewCell obj)\r
-        {\r
-            return FormUtils.ToString(obj, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。\r
-        /// </summary>\r
-        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
-        /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
-        /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
-        public static string ToString(DataGridViewCell obj, string nullStr)\r
-        {\r
-            if (obj == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-            else if (obj.Value == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-\r
-            return obj.Value.ToString();\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region ダイアログ\r
-\r
-        /// <summary>\r
-        /// 単純デザインの通知ダイアログ(入力された文字列を表示)。\r
-        /// </summary>\r
-        /// <param name="msg">メッセージ。</param>\r
-        public static void InformationDialog(string msg)\r
-        {\r
-            // 渡された文字列で通知ダイアログを表示\r
-            MessageBox.Show(\r
-                msg,\r
-                Resources.InformationTitle,\r
-                MessageBoxButtons.OK,\r
-                MessageBoxIcon.Information);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 単純デザインの通知ダイアログ(入力された文字列を書式化して表示)。\r
-        /// </summary>\r
-        /// <param name="format">書式項目を含んだメッセージ。</param>\r
-        /// <param name="args">書式設定対象オブジェクト配列。</param>\r
-        public static void InformationDialog(string format, params object[] args)\r
-        {\r
-            // オーバーロードメソッドをコール\r
-            FormUtils.InformationDialog(String.Format(format, args));\r
-        }\r
-\r
-        /// <summary>\r
-        /// 単純デザインの警告ダイアログ(入力された文字列を表示)。\r
-        /// </summary>\r
-        /// <param name="msg">メッセージ。</param>\r
-        public static void WarningDialog(string msg)\r
-        {\r
-            // 渡された文字列で警告ダイアログを表示\r
-            MessageBox.Show(\r
-                msg,\r
-                Resources.WarningTitle,\r
-                MessageBoxButtons.OK,\r
-                MessageBoxIcon.Warning);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 単純デザインの警告ダイアログ(入力された文字列を書式化して表示)。\r
-        /// </summary>\r
-        /// <param name="format">書式項目を含んだメッセージ。</param>\r
-        /// <param name="args">書式設定対象オブジェクト配列。</param>\r
-        public static void WarningDialog(string format, params object[] args)\r
-        {\r
-            // オーバーロードメソッドをコール\r
-            FormUtils.WarningDialog(String.Format(format, args));\r
-        }\r
-\r
-        /// <summary>\r
-        /// 単純デザインのエラーダイアログ(入力された文字列を表示)。\r
-        /// </summary>\r
-        /// <param name="msg">メッセージ。</param>\r
-        public static void ErrorDialog(string msg)\r
-        {\r
-            // 渡された文字列でエラーダイアログを表示\r
-            MessageBox.Show(\r
-                msg,\r
-                Resources.ErrorTitle,\r
-                MessageBoxButtons.OK,\r
-                MessageBoxIcon.Error);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 単純デザインのエラーダイアログ(入力された文字列を書式化して表示)。\r
-        /// </summary>\r
-        /// <param name="format">書式項目を含んだメッセージ。</param>\r
-        /// <param name="args">書式設定対象オブジェクト配列。</param>\r
-        public static void ErrorDialog(string format, params object[] args)\r
-        {\r
-            // オーバーロードメソッドをコール\r
-            FormUtils.ErrorDialog(String.Format(format, args));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region テーブル処理\r
-\r
-        /// <summary>\r
-        /// <seealso cref="DataGridViewRow"/>が空行かを判定する。\r
-        /// </summary>\r
-        /// <param name="row">1行。</param>\r
-        /// <returns>空行の場合<c>true</c>。</returns>\r
-        public static bool IsEmptyRow(DataGridViewRow row)\r
-        {\r
-            foreach (DataGridViewCell cell in row.Cells)\r
-            {\r
-                if (!String.IsNullOrEmpty(FormUtils.ToString(cell)))\r
-                {\r
-                    return false;\r
-                }\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Windows処理に関するユーティリティクラスソース。</summary>
+//
+// <copyright file="FormUtils.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Reflection;
+    using System.Windows.Forms;
+
+    // ※ プロパティを含むので、そのまま他のプロジェクトに流用することはできない
+    using Honememo.Wptscs.Properties;
+
+    /// <summary>
+    /// Windows処理に関するユーティリティクラスです。
+    /// </summary>
+    public static class FormUtils
+    {
+        #region リソース関連
+
+        /// <summary>
+        /// バージョン情報を含んだアプリケーション名を返す。
+        /// </summary>
+        /// <returns>アプリケーション名</returns>
+        public static string ApplicationName()
+        {
+            // アセンブリからバージョン情報を取得し、書式化して返す
+            // ビルド番号・リビジョンは無視
+            // ※例外なし。もし万が一発生する場合はそのまま投げる
+            Version ver = Assembly.GetExecutingAssembly().GetName().Version;
+            return String.Format(Resources.ApplicationName, ver.Major, ver.Minor);
+        }
+
+        /// <summary>
+        /// 指定されたファイルを UserAppDataPath
+        /// → 旧バージョンのUserAppDataPath
+        /// → StartupPath の順に探索し、その際のパスを返す。
+        /// </summary>
+        /// <param name="fileName">ファイル名。</param>
+        /// <param name="compatible">探索する旧バージョンの最大。</param>
+        /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>
+        /// <remarks>アセンブリ名が変わっている場合、旧バージョンは探索不可。</remarks>
+        public static string SearchUserAppData(string fileName, string compatible)
+        {
+            // 現在の UserAppDataPath を探索
+            string path = Path.Combine(Application.UserAppDataPath, fileName);
+            if (File.Exists(path))
+            {
+                return path;
+            }
+
+            // 可能であれば、旧バージョンの UserAppDataPath を探索
+            if (!String.IsNullOrEmpty(compatible))
+            {
+                // UserAppDataPath は
+                // <ベースパス>\<CompanyName>\<ProductName>\<ProductVersion>
+                // という構成のはずなので、一つ上のフォルダから自分より前のフォルダを探索
+                string parent = Path.GetDirectoryName(Application.UserAppDataPath);
+                if (!String.IsNullOrEmpty(parent))
+                {
+                    // 現在のバージョンのフォルダ名
+                    string now = Path.GetFileName(Application.UserAppDataPath);
+
+                    // 同じ階層のフォルダをすべて取得し、降順にソート
+                    string[] directories = Directory.GetDirectories(parent);
+                    Array.Sort(directories);
+                    Array.Reverse(directories);
+
+                    // ファイルが見つかるまで探索
+                    foreach (string dir in directories)
+                    {
+                        string ver = Path.GetFileName(dir);
+                        if (compatible.CompareTo(ver) <= 0 && ver.CompareTo(now) < 0)
+                        {
+                            path = Path.Combine(dir, fileName);
+                            if (File.Exists(path))
+                            {
+                                return path;
+                            }
+                        }
+                    }
+                }
+            }
+
+            // どこにも無い場合は、exeと同じフォルダを探索
+            path = Path.Combine(Application.StartupPath, fileName);
+            if (File.Exists(path))
+            {
+                return path;
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 指定されたファイルを UserAppDataPath
+        /// → StartupPath の順に探索し、その際のパスを返す。
+        /// </summary>
+        /// <param name="fileName">ファイル名。</param>
+        /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>
+        public static string SearchUserAppData(string fileName)
+        {
+            // オーバーロードメソッドをコール
+            return FormUtils.SearchUserAppData(fileName, null);
+        }
+
+        /// <summary>
+        /// 文字列中のファイル名に使用できない文字を「_」に置換。
+        /// </summary>
+        /// <param name="fileName">ファイル名。</param>
+        /// <returns>置換後のファイル名。</returns>
+        public static string ReplaceInvalidFileNameChars(string fileName)
+        {
+            // 渡された文字列にファイル名に使えない文字が含まれている場合、_ に置き換える
+            string result = fileName;
+            char[] unuseChars = Path.GetInvalidFileNameChars();
+            foreach (char c in unuseChars)
+            {
+                result = result.Replace(c, '_');
+            }
+
+            return result;
+        }
+
+        #endregion
+
+        #region null値許容メソッド
+
+        /// <summary>
+        /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に空の文字列を返す<c>ToString</c>。
+        /// </summary>
+        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+        /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+        public static string ToString(DataGridViewCell obj)
+        {
+            return FormUtils.ToString(obj, String.Empty);
+        }
+
+        /// <summary>
+        /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。
+        /// </summary>
+        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+        /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+        /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+        public static string ToString(DataGridViewCell obj, string nullStr)
+        {
+            if (obj == null)
+            {
+                return nullStr;
+            }
+            else if (obj.Value == null)
+            {
+                return nullStr;
+            }
+
+            return obj.Value.ToString();
+        }
+
+        #endregion
+
+        #region ダイアログ
+
+        /// <summary>
+        /// 単純デザインの通知ダイアログ(入力された文字列を表示)。
+        /// </summary>
+        /// <param name="msg">メッセージ。</param>
+        public static void InformationDialog(string msg)
+        {
+            // 渡された文字列で通知ダイアログを表示
+            MessageBox.Show(
+                msg,
+                Resources.InformationTitle,
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Information);
+        }
+
+        /// <summary>
+        /// 単純デザインの通知ダイアログ(入力された文字列を書式化して表示)。
+        /// </summary>
+        /// <param name="format">書式項目を含んだメッセージ。</param>
+        /// <param name="args">書式設定対象オブジェクト配列。</param>
+        public static void InformationDialog(string format, params object[] args)
+        {
+            // オーバーロードメソッドをコール
+            FormUtils.InformationDialog(String.Format(format, args));
+        }
+
+        /// <summary>
+        /// 単純デザインの警告ダイアログ(入力された文字列を表示)。
+        /// </summary>
+        /// <param name="msg">メッセージ。</param>
+        public static void WarningDialog(string msg)
+        {
+            // 渡された文字列で警告ダイアログを表示
+            MessageBox.Show(
+                msg,
+                Resources.WarningTitle,
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Warning);
+        }
+
+        /// <summary>
+        /// 単純デザインの警告ダイアログ(入力された文字列を書式化して表示)。
+        /// </summary>
+        /// <param name="format">書式項目を含んだメッセージ。</param>
+        /// <param name="args">書式設定対象オブジェクト配列。</param>
+        public static void WarningDialog(string format, params object[] args)
+        {
+            // オーバーロードメソッドをコール
+            FormUtils.WarningDialog(String.Format(format, args));
+        }
+
+        /// <summary>
+        /// 単純デザインのエラーダイアログ(入力された文字列を表示)。
+        /// </summary>
+        /// <param name="msg">メッセージ。</param>
+        public static void ErrorDialog(string msg)
+        {
+            // 渡された文字列でエラーダイアログを表示
+            MessageBox.Show(
+                msg,
+                Resources.ErrorTitle,
+                MessageBoxButtons.OK,
+                MessageBoxIcon.Error);
+        }
+
+        /// <summary>
+        /// 単純デザインのエラーダイアログ(入力された文字列を書式化して表示)。
+        /// </summary>
+        /// <param name="format">書式項目を含んだメッセージ。</param>
+        /// <param name="args">書式設定対象オブジェクト配列。</param>
+        public static void ErrorDialog(string format, params object[] args)
+        {
+            // オーバーロードメソッドをコール
+            FormUtils.ErrorDialog(String.Format(format, args));
+        }
+
+        #endregion
+
+        #region テーブル処理
+
+        /// <summary>
+        /// <seealso cref="DataGridViewRow"/>が空行かを判定する。
+        /// </summary>
+        /// <param name="row">1行。</param>
+        /// <returns>空行の場合<c>true</c>。</returns>
+        public static bool IsEmptyRow(DataGridViewRow row)
+        {
+            foreach (DataGridViewCell cell in row.Cells)
+            {
+                if (!String.IsNullOrEmpty(FormUtils.ToString(cell)))
+                {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        #endregion
+    }
+}
index 447a7a5..acdbbbc 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      曖昧なXML/HTMLタグを解析するためのクラスソース</summary>\r
-//\r
-// <copyright file="LazyXmlParser.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Linq;\r
-    using System.Text;\r
-    using System.Text.RegularExpressions;\r
-\r
-    /// <summary>\r
-    /// 曖昧なXML/HTMLタグを解析するためのクラスです。\r
-    /// </summary>\r
-    /// <remarks>\r
-    /// クラス名通り、多少不正な構文であっても解析する。\r
-    /// </remarks>\r
-    public class LazyXmlParser\r
-    {\r
-        #region 定数宣言\r
-\r
-        /// <summary>\r
-        /// コメントの開始。\r
-        /// </summary>\r
-        protected static readonly string CommentStart = "<!--";\r
-\r
-        /// <summary>\r
-        /// コメントの終了。\r
-        /// </summary>\r
-        protected static readonly string CommentEnd = "-->";\r
-\r
-        #endregion\r
-\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を無視するか?\r
-        /// </summary>\r
-        private bool ignoreCase = true;\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// 大文字小文字を無視するか?\r
-        /// </summary>\r
-        public bool IgnoreCase\r
-        {\r
-            get\r
-            {\r
-                return this.ignoreCase;\r
-            }\r
-\r
-            set\r
-            {\r
-                this.ignoreCase = value;\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// タグはHTMLの書式か?\r
-        /// </summary>\r
-        public bool IsHtml\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 静的メソッド\r
-\r
-        /// <summary>\r
-        /// 渡されたHTMLテキストがコメントかを解析する。\r
-        /// </summary>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="comment">解析したコメント。</param>\r
-        /// <returns>コメントの場合<c>true</c>。</returns>\r
-        /// <remarks>\r
-        /// コメントと判定するには、1文字目が開始タグである必要がある。\r
-        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。\r
-        /// </remarks>\r
-        public static bool TryParseComment(string text, out string comment)\r
-        {\r
-            // 入力値確認\r
-            comment = null;\r
-            if (String.IsNullOrEmpty(text) || !text.StartsWith(LazyXmlParser.CommentStart))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // コメント終了まで取得\r
-            int index = text.IndexOf(LazyXmlParser.CommentEnd);\r
-            if (index < 0)\r
-            {\r
-                // 閉じタグが存在しない場合、最後までコメントと判定\r
-                comment = text;\r
-                return true;\r
-            }\r
-\r
-            // 閉じタグがあった場合、閉じタグの終わりまでを返す\r
-            comment = text.Substring(0, index + CommentEnd.Length);\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region 公開メソッド\r
-\r
-        /// <summary>\r
-        /// 渡されたテキストをXML/HTMLタグとして解析する。\r
-        /// </summary>\r
-        /// <param name="text">解析するテキスト。</param>\r
-        /// <param name="element">解析したタグ。</param>\r
-        /// <returns>タグの場合<c>true</c>。</returns>\r
-        /// <remarks>\r
-        /// XML/HTMLタグと判定するには、1文字目が開始タグである必要がある。\r
-        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。\r
-        /// また、本メソッドはあくまで簡易的な構文用であり、入れ子は考慮しない。\r
-        /// </remarks>\r
-        public bool TryParse(string text, out SimpleElement element)\r
-        {\r
-            // 入力値確認。タグでない場合は即終了\r
-            element = null;\r
-            if (String.IsNullOrEmpty(text) || text[0] != '<')\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // タグ名取得、タグ名の次に出現しうる文字を探索\r
-            int index = text.IndexOfAny(new char[] { ' ', '>', '/' }, 1);\r
-            if (index < 0)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // タグ名確認、コメント(<!--)やちゃんと始まっていないもの(< tag>とか)もここで除外\r
-            string name = text.Substring(1, index - 1);\r
-            if (!this.ValidateName(name))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 開始タグの終端に到達するまで属性を探索\r
-            IDictionary<string, string> attribute;\r
-            int endIndex;\r
-            if (!this.TryParseAttribute(text.Substring(index), out attribute, out endIndex))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            index += endIndex;\r
-\r
-            // "/>" で終わった場合は、ここでタグ終了\r
-            if (text[index - 1] == '/')\r
-            {\r
-                element = new SimpleElement(name, attribute, String.Empty, text.Substring(0, index + 1));\r
-                return true;\r
-            }\r
-\r
-            // 閉じタグまでを解析\r
-            string innerXml;\r
-            if (!this.TryParseContent(text.Substring(index + 1), name, out innerXml, out endIndex))\r
-            {\r
-                return false;\r
-            }\r
-\r
-            if (endIndex < 0)\r
-            {\r
-                // 閉じタグが無い場合\r
-                if (this.IsHtml)\r
-                {\r
-                    // HTMLの場合、閉じタグが無いのは開始タグだけのパターンと判定\r
-                    // ※ indexは開始タグの末尾になっているのでそのまま\r
-                    innerXml = String.Empty;\r
-                }\r
-                else\r
-                {\r
-                    // それ以外は不正な構文だが値の最終文字までを設定\r
-                    index += innerXml.Length;\r
-                }\r
-            }\r
-            else\r
-            {\r
-                index += endIndex;\r
-            }\r
-\r
-            element = new SimpleElement(name, attribute, innerXml, text.Substring(0, index + 1));\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部処理用メソッド\r
-\r
-        /// <summary>\r
-        /// 文字列をXML/HTML読み込み用にデコードする。\r
-        /// </summary>\r
-        /// <param name="str">デコードする文字列。</param>\r
-        /// <returns>デコードされた文字列。<c>null</c>の場合、空文字列を返す。</returns>\r
-        private string Decode(string str)\r
-        {\r
-            if (str == null)\r
-            {\r
-                return String.Empty;\r
-            }\r
-            else if (this.IsHtml)\r
-            {\r
-                return System.Web.HttpUtility.HtmlDecode(str);\r
-            }\r
-            else\r
-            {\r
-                return str.Replace("&lt;", "<").Replace("&gt;", ">")\r
-                    .Replace("&quot;", "\"").Replace("&apos;", "\'").Replace("&amp;", "&");\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたタグ名/属性名がXML的に正しいかを判定。\r
-        /// </summary>\r
-        /// <param name="name">XMLタグ名/属性名。</param>\r
-        /// <returns>正しい場合 <c>true</c>。</returns>\r
-        /// <remarks>\r
-        /// デコード前の値を渡すこと。\r
-        /// HTMLについては、HTML用のチェックではないが、基本的に呼んで問題ないはず。\r
-        /// </remarks>\r
-        private bool ValidateName(string name)\r
-        {\r
-            if (String.IsNullOrEmpty(name))\r
-            {\r
-                // 空は無条件でNG\r
-                return false;\r
-            }\r
-\r
-            if (!this.IsNameFirstCharacter(name[0]))\r
-            {\r
-                // 先頭1文字が許可されていない文字の場合NG\r
-                return false;\r
-            }\r
-\r
-            // 2文字目以降の調査\r
-            for (int i = 1; i < name.Length; i++)\r
-            {\r
-                if (!this.IsNameCharacter(name[i]))\r
-                {\r
-                    // 2文字目以降として使えない文字が出現したらNG\r
-                    return false;\r
-                }\r
-            }\r
-\r
-            // 全てOK\r
-            return true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLタグ名/属性名の先頭文字として使用可能な文字かを判定する。\r
-        /// </summary>\r
-        /// <param name="c">文字。</param>\r
-        /// <returns>使用可能な場合 <c>true</c>。</returns>\r
-        private bool IsNameFirstCharacter(char c)\r
-        {\r
-            // 先頭一文字目はLetterクラスの文字と一部記号のみ許可\r
-            return Char.IsLetter(c) || c == '_' || c == ':';\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLタグ名/属性名の2文字目以降として使用可能な文字かを判定する。\r
-        /// </summary>\r
-        /// <param name="c">文字。</param>\r
-        /// <returns>使用可能な場合 <c>true</c>。</returns>\r
-        private bool IsNameCharacter(char c)\r
-        {\r
-            // 2文字目以降は、一文字目の文字に加えて\r
-            // Digitクラス、Combining Characterクラス、Extenderクラスの文字とハイフン・ピリオドが可能\r
-            // ※ 厳密な判定が大変で、Lazyクラスでそこまでやる必要も感じないので、\r
-            //    処理的に困る制御文字や記号類を除きみんな許可する。\r
-            return this.IsNameFirstCharacter(c) || c == '-' || c == '.'\r
-                || (!Char.IsControl(c) && !Char.IsWhiteSpace(c) && !Char.IsSymbol(c) && !Char.IsPunctuation(c));\r
-        }\r
-\r
-        /// <summary>\r
-        /// タグの属性情報部分のテキストを受け取り、属性情報を解析する。\r
-        /// </summary>\r
-        /// <param name="text">解析する属性情報文字列(" key1="value1" key2="value2"&gt;~" のような文字列)。</param>\r
-        /// <param name="attribute">解析した属性。</param>\r
-        /// <param name="endIndex">タグ終了箇所('&gt;')のインデックス。</param>\r
-        /// <returns>解析に成功した場合<c>true</c>。</returns>\r
-        private bool TryParseAttribute(string text, out IDictionary<string, string> attribute, out int endIndex)\r
-        {\r
-            // ※ 不正な構文も通すために、強引な汚いソースになってしまっている。\r
-            //    このメソッドにその辺りの処理を隔離している。\r
-\r
-            // 出力値初期化\r
-            attribute = null;\r
-            endIndex = -1;\r
-\r
-            // 開始タグの終端に到達するまで属性を探索\r
-            IDictionary<string, string> a = new Dictionary<string, string>();\r
-            string key = null;\r
-            bool existedEqual = false;\r
-            bool existedSpace = false;\r
-            char[] separators = null;\r
-            int i;\r
-            for (i = 0; i < text.Length; i++)\r
-            {\r
-                char c = text[i];\r
-                if (key == null)\r
-                {\r
-                    // 属性名の解析\r
-                    if (c == ' ')\r
-                    {\r
-                        // 属性名の前にあるスペースは無視\r
-                        continue;\r
-                    }\r
-\r
-                    // 属性名の次に出現しうる文字を探索\r
-                    int index = text.IndexOfAny(new char[] { '=', ' ', '>', '/' }, i);\r
-                    if (index < 0)\r
-                    {\r
-                        // どれも出現しない場合、構文エラー\r
-                        return false;\r
-                    }\r
-\r
-                    // 属性名を確認\r
-                    // ※ 属性が無い場合0文字となる\r
-                    key = text.Substring(i, index - i);\r
-                    if (!String.IsNullOrEmpty(key) && !this.ValidateName(key))\r
-                    {\r
-                        // 属性名の位置に出現し得ない記号が含まれているなど構文エラーも弾く\r
-                        return false;\r
-                    }\r
-\r
-                    // ループを次回「次に出現しうる文字」になるよう更新\r
-                    i = index - 1;\r
-                }\r
-                else if (!existedEqual)\r
-                {\r
-                    // 属性名は解析済みでも値が始まっていない場合\r
-                    if (c == '=')\r
-                    {\r
-                        // イコール後の処理に切り替え\r
-                        existedEqual = true;\r
-                        existedSpace = false;\r
-                    }\r
-                    else if (c == '>' || c == '/')\r
-                    {\r
-                        // ループ終了\r
-                        if (!String.IsNullOrEmpty(key))\r
-                        {\r
-                            // 属性名だけで値が無いパターン(<div disable>とか)\r
-                            a[this.Decode(key)] = String.Empty;\r
-                            key = null;\r
-                        }\r
-\r
-                        break;\r
-                    }\r
-                    else if (c == ' ')\r
-                    {\r
-                        // 属性名の後にあるスペースは記録して無視\r
-                        existedSpace = true;\r
-                    }\r
-                    else if (existedSpace)\r
-                    {\r
-                        // 既にスペースが出現した状態で新たに普通の文字が出現した場合、\r
-                        // キーだけで値が無いパターンだったと判定\r
-                        a[this.Decode(key)] = String.Empty;\r
-                        key = null;\r
-                        existedSpace = false;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    // 属性値の解析\r
-                    if (separators == null)\r
-                    {\r
-                        if (c == ' ')\r
-                        {\r
-                            // イコールの後の、値に入る前のスペースは無視\r
-                            continue;\r
-                        }\r
-\r
-                        // イコール後の最初の文字の場合、区切り文字かを確認\r
-                        if (c == '\'' || c == '"')\r
-                        {\r
-                            separators = new char[] { c };\r
-                            continue;\r
-                        }\r
-\r
-                        // いきなり値が始まっている場合は、次の文字までを値と判定\r
-                        separators = new char[] { ' ', '>', '/' };\r
-                    }\r
-\r
-                    // 属性値の終了文字を探索\r
-                    int index = text.IndexOfAny(separators, i);\r
-                    if (index < 0)\r
-                    {\r
-                        // どれも出現しない場合、閉じてないということで構文エラー\r
-                        return false;\r
-                    }\r
-\r
-                    // 区切り文字に到達\r
-                    a[this.Decode(key)] = this.Decode(text.Substring(i, index - i));\r
-                    key = null;\r
-                    existedEqual = false;\r
-                    separators = null;\r
-\r
-                    if (text[index] == '>' || text[index] == '/')\r
-                    {\r
-                        // 区切り文字がループ終了の文字だったらここで終了\r
-                        break;\r
-                    }\r
-\r
-                    // ループを次回「区切り文字の次の文字」になるよう更新\r
-                    i = index;\r
-                }\r
-            }\r
-\r
-            // '/' で抜けた場合は、閉じ括弧があるはず位置にインデックスを移動\r
-            if (text.ElementAtOrDefault(i) == '/')\r
-            {\r
-                ++i;\r
-            }\r
-\r
-            // 最後が閉じ括弧で無い場合、閉じていないのでNG\r
-            // ※ ループが閉じ括弧で終わらなかった場合もここに引っかかる\r
-            if (text.ElementAtOrDefault(i) != '>')\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 出力値の設定\r
-            attribute = a;\r
-            endIndex = i;\r
-\r
-            return true;\r
-        }\r
-\r
-        /// <summary>\r
-        /// タグの開始タグ以降の部分のテキストを受け取り、値と閉じタグを解析する。\r
-        /// </summary>\r
-        /// <param name="text">解析する部分文字列("~&lt;/tag&gt;" のような文字列)。</param>\r
-        /// <param name="tag">解析するタグ名。</param>\r
-        /// <param name="innerXml">解析したコンテンツ部分。</param>\r
-        /// <param name="endIndex">閉じタグ終了箇所('&gt;')のインデックス。閉じていない場合は-1。</param>\r
-        /// <returns>\r
-        /// 解析に成功した場合<c>true</c>。\r
-        /// ※現状では常に<c>true</c>。単に他とパラメータをあわせただけ。\r
-        /// </returns>\r
-        private bool TryParseContent(string text, string tag, out string innerXml, out int endIndex)\r
-        {\r
-            // 閉じタグまでを取得。終わりが見つからない場合は、全てタグブロックと判断\r
-            innerXml = text;\r
-            endIndex = -1;\r
-\r
-            // 検索条件作成\r
-            RegexOptions options = RegexOptions.Singleline;\r
-            if (this.IgnoreCase)\r
-            {\r
-                // 大文字小文字を区別しない\r
-                options = options | RegexOptions.IgnoreCase;\r
-            }\r
-\r
-            Regex endRegex = new Regex("^</" + Regex.Escape(tag) + "\\s*>", options);\r
-\r
-            for (int i = 0; i < text.Length; i++)\r
-            {\r
-                // ※ 本当は全て正規表現一発で処理したいが、コメントが含まれている可能性があるのでループ\r
-                if (text[i] != '<')\r
-                {\r
-                    continue;\r
-                }\r
-\r
-                // 終了条件のチェック\r
-                string s = text.Substring(i);\r
-                Match match = endRegex.Match(s);\r
-                if (match.Success)\r
-                {\r
-                    innerXml = text.Substring(0, i);\r
-                    endIndex = i + match.Length;\r
-                    break;\r
-                }\r
-\r
-                // コメント(<!--)のチェック\r
-                string comment;\r
-                if (LazyXmlParser.TryParseComment(s, out comment))\r
-                {\r
-                    i += comment.Length - 1;\r
-                    continue;\r
-                }\r
-            }\r
-\r
-            return true;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部クラス\r
-\r
-        /// <summary>\r
-        /// XML/HTMLタグをあらわすモデルクラスです。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// パラメータ等は<c>XmlElement</c>に似せている。\r
-        /// 本当はそちらを返したいが設定すべき項目が多く簡単に使用できないため。\r
-        /// </remarks>\r
-        public class SimpleElement\r
-        {\r
-            #region コンストラクタ\r
-\r
-            /// <summary>\r
-            /// 指定された情報を持つタグを作成する。\r
-            /// </summary>\r
-            /// <param name="name">タグ名。</param>\r
-            /// <param name="attributes">属性情報。</param>\r
-            /// <param name="innerXml">このタグに含まれる値。</param>\r
-            /// <param name="outerXml">このタグの開始/終了タグを含む文字列。</param>\r
-            public SimpleElement(string name, IDictionary<string, string> attributes, string innerXml, string outerXml)\r
-            {\r
-                this.Name = name;\r
-                this.Attributes = attributes;\r
-                this.InnerXml = innerXml;\r
-                this.OuterXml = outerXml;\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region プロパティ\r
-\r
-            /// <summary>\r
-            /// タグ名。\r
-            /// </summary>\r
-            public string Name\r
-            {\r
-                get;\r
-                private set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// このタグに含まれる文字列。\r
-            /// </summary>\r
-            public string InnerXml\r
-            {\r
-                get;\r
-                private set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// このタグの開始/終了タグを含む文字列。\r
-            /// </summary>\r
-            public string OuterXml\r
-            {\r
-                get;\r
-                private set;\r
-            }\r
-\r
-            /// <summary>\r
-            /// タグに含まれる属性情報。\r
-            /// </summary>\r
-            public IDictionary<string, string> Attributes\r
-            {\r
-                get;\r
-                private set;\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region メソッド\r
-\r
-            /// <summary>\r
-            /// タグに指定した名前の属性があるかどうかを確認する。\r
-            /// </summary>\r
-            /// <param name="name">検索する属性の名前。</param>\r
-            /// <returns>現在のノードに指定した属性がある場合は <c>true</c>。それ以外の場合は <c>false</c>。</returns>\r
-            public bool HasAttribute(string name)\r
-            {\r
-                return this.Attributes.ContainsKey(name);\r
-            }\r
-\r
-            /// <summary>\r
-            /// 指定した名前の属性の値を返す。\r
-            /// </summary>\r
-            /// <param name="name">取得する属性の名前。</param>\r
-            /// <returns>指定した属性の値。一致する属性が見つからない場合、属性に指定した値がない場合は、空の文字列を返す。</returns>\r
-            public string GetAttribute(string name)\r
-            {\r
-                string value;\r
-                if (this.Attributes.TryGetValue(name, out value))\r
-                {\r
-                    return StringUtils.DefaultString(value);\r
-                }\r
-\r
-                return String.Empty;\r
-            }\r
-\r
-            /// <summary>\r
-            /// <c>OuterXml</c> を返す。\r
-            /// </summary>\r
-            /// <returns><c>OuterXml</c>。</returns>\r
-            public override string ToString()\r
-            {\r
-                return this.OuterXml;\r
-            }\r
-\r
-            #endregion\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      曖昧なXML/HTMLタグを解析するためのクラスソース</summary>
+//
+// <copyright file="LazyXmlParser.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using System.Text;
+    using System.Text.RegularExpressions;
+
+    /// <summary>
+    /// 曖昧なXML/HTMLタグを解析するためのクラスです。
+    /// </summary>
+    /// <remarks>
+    /// クラス名通り、多少不正な構文であっても解析する。
+    /// </remarks>
+    public class LazyXmlParser
+    {
+        #region 定数宣言
+
+        /// <summary>
+        /// コメントの開始。
+        /// </summary>
+        protected static readonly string CommentStart = "<!--";
+
+        /// <summary>
+        /// コメントの終了。
+        /// </summary>
+        protected static readonly string CommentEnd = "-->";
+
+        #endregion
+
+        #region private変数
+
+        /// <summary>
+        /// 大文字小文字を無視するか?
+        /// </summary>
+        private bool ignoreCase = true;
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// 大文字小文字を無視するか?
+        /// </summary>
+        public bool IgnoreCase
+        {
+            get
+            {
+                return this.ignoreCase;
+            }
+
+            set
+            {
+                this.ignoreCase = value;
+            }
+        }
+
+        /// <summary>
+        /// タグはHTMLの書式か?
+        /// </summary>
+        public bool IsHtml
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region 静的メソッド
+
+        /// <summary>
+        /// 渡されたHTMLテキストがコメントかを解析する。
+        /// </summary>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="comment">解析したコメント。</param>
+        /// <returns>コメントの場合<c>true</c>。</returns>
+        /// <remarks>
+        /// コメントと判定するには、1文字目が開始タグである必要がある。
+        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。
+        /// </remarks>
+        public static bool TryParseComment(string text, out string comment)
+        {
+            // 入力値確認
+            comment = null;
+            if (String.IsNullOrEmpty(text) || !text.StartsWith(LazyXmlParser.CommentStart))
+            {
+                return false;
+            }
+
+            // コメント終了まで取得
+            int index = text.IndexOf(LazyXmlParser.CommentEnd);
+            if (index < 0)
+            {
+                // 閉じタグが存在しない場合、最後までコメントと判定
+                comment = text;
+                return true;
+            }
+
+            // 閉じタグがあった場合、閉じタグの終わりまでを返す
+            comment = text.Substring(0, index + CommentEnd.Length);
+            return true;
+        }
+
+        #endregion
+        
+        #region 公開メソッド
+
+        /// <summary>
+        /// 渡されたテキストをXML/HTMLタグとして解析する。
+        /// </summary>
+        /// <param name="text">解析するテキスト。</param>
+        /// <param name="element">解析したタグ。</param>
+        /// <returns>タグの場合<c>true</c>。</returns>
+        /// <remarks>
+        /// XML/HTMLタグと判定するには、1文字目が開始タグである必要がある。
+        /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。
+        /// また、本メソッドはあくまで簡易的な構文用であり、入れ子は考慮しない。
+        /// </remarks>
+        public bool TryParse(string text, out SimpleElement element)
+        {
+            // 入力値確認。タグでない場合は即終了
+            element = null;
+            if (String.IsNullOrEmpty(text) || text[0] != '<')
+            {
+                return false;
+            }
+
+            // タグ名取得、タグ名の次に出現しうる文字を探索
+            int index = text.IndexOfAny(new char[] { ' ', '>', '/' }, 1);
+            if (index < 0)
+            {
+                return false;
+            }
+
+            // タグ名確認、コメント(<!--)やちゃんと始まっていないもの(< tag>とか)もここで除外
+            string name = text.Substring(1, index - 1);
+            if (!this.ValidateName(name))
+            {
+                return false;
+            }
+
+            // 開始タグの終端に到達するまで属性を探索
+            IDictionary<string, string> attribute;
+            int endIndex;
+            if (!this.TryParseAttribute(text.Substring(index), out attribute, out endIndex))
+            {
+                return false;
+            }
+
+            index += endIndex;
+
+            // "/>" で終わった場合は、ここでタグ終了
+            if (text[index - 1] == '/')
+            {
+                element = new SimpleElement(name, attribute, String.Empty, text.Substring(0, index + 1));
+                return true;
+            }
+
+            // 閉じタグまでを解析
+            string innerXml;
+            if (!this.TryParseContent(text.Substring(index + 1), name, out innerXml, out endIndex))
+            {
+                return false;
+            }
+
+            if (endIndex < 0)
+            {
+                // 閉じタグが無い場合
+                if (this.IsHtml)
+                {
+                    // HTMLの場合、閉じタグが無いのは開始タグだけのパターンと判定
+                    // ※ indexは開始タグの末尾になっているのでそのまま
+                    innerXml = String.Empty;
+                }
+                else
+                {
+                    // それ以外は不正な構文だが値の最終文字までを設定
+                    index += innerXml.Length;
+                }
+            }
+            else
+            {
+                index += endIndex;
+            }
+
+            element = new SimpleElement(name, attribute, innerXml, text.Substring(0, index + 1));
+            return true;
+        }
+
+        #endregion
+
+        #region 内部処理用メソッド
+
+        /// <summary>
+        /// 文字列をXML/HTML読み込み用にデコードする。
+        /// </summary>
+        /// <param name="str">デコードする文字列。</param>
+        /// <returns>デコードされた文字列。<c>null</c>の場合、空文字列を返す。</returns>
+        private string Decode(string str)
+        {
+            if (str == null)
+            {
+                return String.Empty;
+            }
+            else if (this.IsHtml)
+            {
+                return System.Web.HttpUtility.HtmlDecode(str);
+            }
+            else
+            {
+                return str.Replace("&lt;", "<").Replace("&gt;", ">")
+                    .Replace("&quot;", "\"").Replace("&apos;", "\'").Replace("&amp;", "&");
+            }
+        }
+
+        /// <summary>
+        /// 渡されたタグ名/属性名がXML的に正しいかを判定。
+        /// </summary>
+        /// <param name="name">XMLタグ名/属性名。</param>
+        /// <returns>正しい場合 <c>true</c>。</returns>
+        /// <remarks>
+        /// デコード前の値を渡すこと。
+        /// HTMLについては、HTML用のチェックではないが、基本的に呼んで問題ないはず。
+        /// </remarks>
+        private bool ValidateName(string name)
+        {
+            if (String.IsNullOrEmpty(name))
+            {
+                // 空は無条件でNG
+                return false;
+            }
+
+            if (!this.IsNameFirstCharacter(name[0]))
+            {
+                // 先頭1文字が許可されていない文字の場合NG
+                return false;
+            }
+
+            // 2文字目以降の調査
+            for (int i = 1; i < name.Length; i++)
+            {
+                if (!this.IsNameCharacter(name[i]))
+                {
+                    // 2文字目以降として使えない文字が出現したらNG
+                    return false;
+                }
+            }
+
+            // 全てOK
+            return true;
+        }
+
+        /// <summary>
+        /// XMLタグ名/属性名の先頭文字として使用可能な文字かを判定する。
+        /// </summary>
+        /// <param name="c">文字。</param>
+        /// <returns>使用可能な場合 <c>true</c>。</returns>
+        private bool IsNameFirstCharacter(char c)
+        {
+            // 先頭一文字目はLetterクラスの文字と一部記号のみ許可
+            return Char.IsLetter(c) || c == '_' || c == ':';
+        }
+
+        /// <summary>
+        /// XMLタグ名/属性名の2文字目以降として使用可能な文字かを判定する。
+        /// </summary>
+        /// <param name="c">文字。</param>
+        /// <returns>使用可能な場合 <c>true</c>。</returns>
+        private bool IsNameCharacter(char c)
+        {
+            // 2文字目以降は、一文字目の文字に加えて
+            // Digitクラス、Combining Characterクラス、Extenderクラスの文字とハイフン・ピリオドが可能
+            // ※ 厳密な判定が大変で、Lazyクラスでそこまでやる必要も感じないので、
+            //    処理的に困る制御文字や記号類を除きみんな許可する。
+            return this.IsNameFirstCharacter(c) || c == '-' || c == '.'
+                || (!Char.IsControl(c) && !Char.IsWhiteSpace(c) && !Char.IsSymbol(c) && !Char.IsPunctuation(c));
+        }
+
+        /// <summary>
+        /// タグの属性情報部分のテキストを受け取り、属性情報を解析する。
+        /// </summary>
+        /// <param name="text">解析する属性情報文字列(" key1="value1" key2="value2"&gt;~" のような文字列)。</param>
+        /// <param name="attribute">解析した属性。</param>
+        /// <param name="endIndex">タグ終了箇所('&gt;')のインデックス。</param>
+        /// <returns>解析に成功した場合<c>true</c>。</returns>
+        private bool TryParseAttribute(string text, out IDictionary<string, string> attribute, out int endIndex)
+        {
+            // ※ 不正な構文も通すために、強引な汚いソースになってしまっている。
+            //    このメソッドにその辺りの処理を隔離している。
+
+            // 出力値初期化
+            attribute = null;
+            endIndex = -1;
+
+            // 開始タグの終端に到達するまで属性を探索
+            IDictionary<string, string> a = new Dictionary<string, string>();
+            string key = null;
+            bool existedEqual = false;
+            bool existedSpace = false;
+            char[] separators = null;
+            int i;
+            for (i = 0; i < text.Length; i++)
+            {
+                char c = text[i];
+                if (key == null)
+                {
+                    // 属性名の解析
+                    if (c == ' ')
+                    {
+                        // 属性名の前にあるスペースは無視
+                        continue;
+                    }
+
+                    // 属性名の次に出現しうる文字を探索
+                    int index = text.IndexOfAny(new char[] { '=', ' ', '>', '/' }, i);
+                    if (index < 0)
+                    {
+                        // どれも出現しない場合、構文エラー
+                        return false;
+                    }
+
+                    // 属性名を確認
+                    // ※ 属性が無い場合0文字となる
+                    key = text.Substring(i, index - i);
+                    if (!String.IsNullOrEmpty(key) && !this.ValidateName(key))
+                    {
+                        // 属性名の位置に出現し得ない記号が含まれているなど構文エラーも弾く
+                        return false;
+                    }
+
+                    // ループを次回「次に出現しうる文字」になるよう更新
+                    i = index - 1;
+                }
+                else if (!existedEqual)
+                {
+                    // 属性名は解析済みでも値が始まっていない場合
+                    if (c == '=')
+                    {
+                        // イコール後の処理に切り替え
+                        existedEqual = true;
+                        existedSpace = false;
+                    }
+                    else if (c == '>' || c == '/')
+                    {
+                        // ループ終了
+                        if (!String.IsNullOrEmpty(key))
+                        {
+                            // 属性名だけで値が無いパターン(<div disable>とか)
+                            a[this.Decode(key)] = String.Empty;
+                            key = null;
+                        }
+
+                        break;
+                    }
+                    else if (c == ' ')
+                    {
+                        // 属性名の後にあるスペースは記録して無視
+                        existedSpace = true;
+                    }
+                    else if (existedSpace)
+                    {
+                        // 既にスペースが出現した状態で新たに普通の文字が出現した場合、
+                        // キーだけで値が無いパターンだったと判定
+                        a[this.Decode(key)] = String.Empty;
+                        key = null;
+                        existedSpace = false;
+                    }
+                }
+                else
+                {
+                    // 属性値の解析
+                    if (separators == null)
+                    {
+                        if (c == ' ')
+                        {
+                            // イコールの後の、値に入る前のスペースは無視
+                            continue;
+                        }
+
+                        // イコール後の最初の文字の場合、区切り文字かを確認
+                        if (c == '\'' || c == '"')
+                        {
+                            separators = new char[] { c };
+                            continue;
+                        }
+
+                        // いきなり値が始まっている場合は、次の文字までを値と判定
+                        separators = new char[] { ' ', '>', '/' };
+                    }
+
+                    // 属性値の終了文字を探索
+                    int index = text.IndexOfAny(separators, i);
+                    if (index < 0)
+                    {
+                        // どれも出現しない場合、閉じてないということで構文エラー
+                        return false;
+                    }
+
+                    // 区切り文字に到達
+                    a[this.Decode(key)] = this.Decode(text.Substring(i, index - i));
+                    key = null;
+                    existedEqual = false;
+                    separators = null;
+
+                    if (text[index] == '>' || text[index] == '/')
+                    {
+                        // 区切り文字がループ終了の文字だったらここで終了
+                        break;
+                    }
+
+                    // ループを次回「区切り文字の次の文字」になるよう更新
+                    i = index;
+                }
+            }
+
+            // '/' で抜けた場合は、閉じ括弧があるはず位置にインデックスを移動
+            if (text.ElementAtOrDefault(i) == '/')
+            {
+                ++i;
+            }
+
+            // 最後が閉じ括弧で無い場合、閉じていないのでNG
+            // ※ ループが閉じ括弧で終わらなかった場合もここに引っかかる
+            if (text.ElementAtOrDefault(i) != '>')
+            {
+                return false;
+            }
+
+            // 出力値の設定
+            attribute = a;
+            endIndex = i;
+
+            return true;
+        }
+
+        /// <summary>
+        /// タグの開始タグ以降の部分のテキストを受け取り、値と閉じタグを解析する。
+        /// </summary>
+        /// <param name="text">解析する部分文字列("~&lt;/tag&gt;" のような文字列)。</param>
+        /// <param name="tag">解析するタグ名。</param>
+        /// <param name="innerXml">解析したコンテンツ部分。</param>
+        /// <param name="endIndex">閉じタグ終了箇所('&gt;')のインデックス。閉じていない場合は-1。</param>
+        /// <returns>
+        /// 解析に成功した場合<c>true</c>。
+        /// ※現状では常に<c>true</c>。単に他とパラメータをあわせただけ。
+        /// </returns>
+        private bool TryParseContent(string text, string tag, out string innerXml, out int endIndex)
+        {
+            // 閉じタグまでを取得。終わりが見つからない場合は、全てタグブロックと判断
+            innerXml = text;
+            endIndex = -1;
+
+            // 検索条件作成
+            RegexOptions options = RegexOptions.Singleline;
+            if (this.IgnoreCase)
+            {
+                // 大文字小文字を区別しない
+                options = options | RegexOptions.IgnoreCase;
+            }
+
+            Regex endRegex = new Regex("^</" + Regex.Escape(tag) + "\\s*>", options);
+
+            for (int i = 0; i < text.Length; i++)
+            {
+                // ※ 本当は全て正規表現一発で処理したいが、コメントが含まれている可能性があるのでループ
+                if (text[i] != '<')
+                {
+                    continue;
+                }
+
+                // 終了条件のチェック
+                string s = text.Substring(i);
+                Match match = endRegex.Match(s);
+                if (match.Success)
+                {
+                    innerXml = text.Substring(0, i);
+                    endIndex = i + match.Length;
+                    break;
+                }
+
+                // コメント(<!--)のチェック
+                string comment;
+                if (LazyXmlParser.TryParseComment(s, out comment))
+                {
+                    i += comment.Length - 1;
+                    continue;
+                }
+            }
+
+            return true;
+        }
+
+        #endregion
+
+        #region 内部クラス
+
+        /// <summary>
+        /// XML/HTMLタグをあらわすモデルクラスです。
+        /// </summary>
+        /// <remarks>
+        /// パラメータ等は<c>XmlElement</c>に似せている。
+        /// 本当はそちらを返したいが設定すべき項目が多く簡単に使用できないため。
+        /// </remarks>
+        public class SimpleElement
+        {
+            #region コンストラクタ
+
+            /// <summary>
+            /// 指定された情報を持つタグを作成する。
+            /// </summary>
+            /// <param name="name">タグ名。</param>
+            /// <param name="attributes">属性情報。</param>
+            /// <param name="innerXml">このタグに含まれる値。</param>
+            /// <param name="outerXml">このタグの開始/終了タグを含む文字列。</param>
+            public SimpleElement(string name, IDictionary<string, string> attributes, string innerXml, string outerXml)
+            {
+                this.Name = name;
+                this.Attributes = attributes;
+                this.InnerXml = innerXml;
+                this.OuterXml = outerXml;
+            }
+
+            #endregion
+
+            #region プロパティ
+
+            /// <summary>
+            /// タグ名。
+            /// </summary>
+            public string Name
+            {
+                get;
+                private set;
+            }
+
+            /// <summary>
+            /// このタグに含まれる文字列。
+            /// </summary>
+            public string InnerXml
+            {
+                get;
+                private set;
+            }
+
+            /// <summary>
+            /// このタグの開始/終了タグを含む文字列。
+            /// </summary>
+            public string OuterXml
+            {
+                get;
+                private set;
+            }
+
+            /// <summary>
+            /// タグに含まれる属性情報。
+            /// </summary>
+            public IDictionary<string, string> Attributes
+            {
+                get;
+                private set;
+            }
+
+            #endregion
+
+            #region メソッド
+
+            /// <summary>
+            /// タグに指定した名前の属性があるかどうかを確認する。
+            /// </summary>
+            /// <param name="name">検索する属性の名前。</param>
+            /// <returns>現在のノードに指定した属性がある場合は <c>true</c>。それ以外の場合は <c>false</c>。</returns>
+            public bool HasAttribute(string name)
+            {
+                return this.Attributes.ContainsKey(name);
+            }
+
+            /// <summary>
+            /// 指定した名前の属性の値を返す。
+            /// </summary>
+            /// <param name="name">取得する属性の名前。</param>
+            /// <returns>指定した属性の値。一致する属性が見つからない場合、属性に指定した値がない場合は、空の文字列を返す。</returns>
+            public string GetAttribute(string name)
+            {
+                string value;
+                if (this.Attributes.TryGetValue(name, out value))
+                {
+                    return StringUtils.DefaultString(value);
+                }
+
+                return String.Empty;
+            }
+
+            /// <summary>
+            /// <c>OuterXml</c> を返す。
+            /// </summary>
+            /// <returns><c>OuterXml</c>。</returns>
+            public override string ToString()
+            {
+                return this.OuterXml;
+            }
+
+            #endregion
+        }
+
+        #endregion
+    }
+}
index 4f10231..449b4b1 100644 (file)
@@ -1,92 +1,92 @@
-// ================================================================================================\r
-// <summary>\r
-//      Apache Commons Lang の ObjectUtilsを参考にしたユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="ObjectUtils.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-\r
-    /// <summary>\r
-    /// Apache Commons Lang の ObjectUtilsを参考にしたユーティリティクラスです。\r
-    /// </summary>\r
-    /// <remarks>http://commons.apache.org/lang/api/org/apache/commons/lang/ObjectUtils.html</remarks>\r
-    public static class ObjectUtils\r
-    {\r
-        #region 初期化メソッド\r
-\r
-        /// <summary>\r
-        /// オブジェクトが<c>null</c>の場合に指定されたオブジェクトを返す。\r
-        /// </summary>\r
-        /// <param name="obj">テストするオブジェクト。<c>null</c>も可。</param>\r
-        /// <param name="defaultValue">渡されたオブジェクトが<c>null</c>の場合に返されるデフォルトのオブジェクト。</param>\r
-        /// <returns>渡されたオブジェクト、<c>null</c>の場合にはデフォルトのオブジェクト。</returns>\r
-        /// <typeparam name="T">オブジェクトの型。</typeparam>\r
-        public static T DefaultIfNull<T>(T obj, T defaultValue)\r
-        {\r
-            if (obj == null)\r
-            {\r
-                return defaultValue;\r
-            }\r
-\r
-            return obj;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region null値許容メソッド\r
-\r
-        /// <summary>\r
-        /// 二つのオブジェクトが同じかを比較する。両方がまたは片方が<c>null</c>の場合も許容する。\r
-        /// </summary>\r
-        /// <param name="object1">比較する一つ目のオブジェクト。<c>null</c>も可。</param>\r
-        /// <param name="object2">比較する二つ目のオブジェクト。<c>null</c>も可。</param>\r
-        /// <returns>渡されたオブジェクトを<c>Equals</c>した結果。両方が<c>null</c>の場合は<c>true</c>を返す。</returns>\r
-        public static new bool Equals(object object1, object object2)\r
-        {\r
-            if (object1 == null && object2 == null)\r
-            {\r
-                return true;\r
-            }\r
-            else if (object1 == null || object2 == null)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            return object1.Equals(object2);\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトが<c>null</c>の場合に空の文字列を返す<c>ToString</c>。\r
-        /// </summary>\r
-        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
-        /// <returns>渡されたオブジェクトを<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
-        public static string ToString(object obj)\r
-        {\r
-            return ObjectUtils.ToString(obj, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// オブジェクトが<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。\r
-        /// </summary>\r
-        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
-        /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
-        /// <returns>渡されたオブジェクトを<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
-        public static string ToString(object obj, string nullStr)\r
-        {\r
-            if (obj == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-\r
-            return obj.ToString();\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Apache Commons Lang の ObjectUtilsを参考にしたユーティリティクラスソース。</summary>
+//
+// <copyright file="ObjectUtils.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+
+    /// <summary>
+    /// Apache Commons Lang の ObjectUtilsを参考にしたユーティリティクラスです。
+    /// </summary>
+    /// <remarks>http://commons.apache.org/lang/api/org/apache/commons/lang/ObjectUtils.html</remarks>
+    public static class ObjectUtils
+    {
+        #region 初期化メソッド
+
+        /// <summary>
+        /// オブジェクトが<c>null</c>の場合に指定されたオブジェクトを返す。
+        /// </summary>
+        /// <param name="obj">テストするオブジェクト。<c>null</c>も可。</param>
+        /// <param name="defaultValue">渡されたオブジェクトが<c>null</c>の場合に返されるデフォルトのオブジェクト。</param>
+        /// <returns>渡されたオブジェクト、<c>null</c>の場合にはデフォルトのオブジェクト。</returns>
+        /// <typeparam name="T">オブジェクトの型。</typeparam>
+        public static T DefaultIfNull<T>(T obj, T defaultValue)
+        {
+            if (obj == null)
+            {
+                return defaultValue;
+            }
+
+            return obj;
+        }
+
+        #endregion
+
+        #region null値許容メソッド
+
+        /// <summary>
+        /// 二つのオブジェクトが同じかを比較する。両方がまたは片方が<c>null</c>の場合も許容する。
+        /// </summary>
+        /// <param name="object1">比較する一つ目のオブジェクト。<c>null</c>も可。</param>
+        /// <param name="object2">比較する二つ目のオブジェクト。<c>null</c>も可。</param>
+        /// <returns>渡されたオブジェクトを<c>Equals</c>した結果。両方が<c>null</c>の場合は<c>true</c>を返す。</returns>
+        public static new bool Equals(object object1, object object2)
+        {
+            if (object1 == null && object2 == null)
+            {
+                return true;
+            }
+            else if (object1 == null || object2 == null)
+            {
+                return false;
+            }
+
+            return object1.Equals(object2);
+        }
+
+        /// <summary>
+        /// オブジェクトが<c>null</c>の場合に空の文字列を返す<c>ToString</c>。
+        /// </summary>
+        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+        /// <returns>渡されたオブジェクトを<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+        public static string ToString(object obj)
+        {
+            return ObjectUtils.ToString(obj, String.Empty);
+        }
+
+        /// <summary>
+        /// オブジェクトが<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。
+        /// </summary>
+        /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+        /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+        /// <returns>渡されたオブジェクトを<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+        public static string ToString(object obj, string nullStr)
+        {
+            if (obj == null)
+            {
+                return nullStr;
+            }
+
+            return obj.ToString();
+        }
+
+        #endregion
+    }
+}
index d449ae2..467ec3f 100644 (file)
@@ -1,99 +1,99 @@
-// ================================================================================================\r
-// <summary>\r
-//      文字列処理に関するユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="StringUtils.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-\r
-    /// <summary>\r
-    /// 文字列処理に関するユーティリティクラスです。\r
-    /// </summary>\r
-    /// <remarks>一部メソッドは、Apache Commons Lang の StringUtils やJava標準の String を参考にしています。</remarks>\r
-    public static class StringUtils\r
-    {\r
-        #region 初期化メソッド\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、<c>null</c>だった場合には空の文字列を返します。\r
-        /// それ以外の場合には渡された文字列を返します。\r
-        /// </summary>\r
-        /// <param name="str">チェックを行う対象となる文字列。</param>\r
-        /// <returns>渡された文字列、<c>null</c>の場合には空の文字列。</returns>\r
-        public static string DefaultString(string str)\r
-        {\r
-            return StringUtils.DefaultString(str, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、<c>null</c>だった場合には指定されたデフォルトの文字列を返します。\r
-        /// それ以外の場合には渡された文字列を返します。\r
-        /// </summary>\r
-        /// <param name="str">チェックを行う対象となる文字列。</param>\r
-        /// <param name="defaultString">渡された文字列が<c>null</c>の場合に返されるデフォルトの文字列。</param>\r
-        /// <returns>渡された文字列、<c>null</c>の場合にはデフォルトの文字列。</returns>\r
-        public static string DefaultString(string str, string defaultString)\r
-        {\r
-            if (str == null)\r
-            {\r
-                return defaultString;\r
-            }\r
-\r
-            return str;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 文字列チェック\r
-\r
-        /// <summary>\r
-        /// この文字列の指定されたインデックス以降の部分文字列が、指定された接頭辞で始まるかどうかを判定します。\r
-        /// </summary>\r
-        /// <param name="str">チェックを行う対象となる文字列。</param>\r
-        /// <param name="prefix">接頭辞。</param>\r
-        /// <param name="toffset">この文字列の比較を開始する位置。</param>\r
-        /// <returns>始まる場合<c>true</c>。<c>toffset</c>が負の値の場合、<c>str</c>の長さより大きい場合<c>false</c>。それ以外で<c>prefix</c>が空の場合は<c>true</c>。</returns>\r
-        /// <remarks>引数の<c>null</c>は許容、<c>str</c>のみまたは<c>prefix</c>のみ<c>null</c>は<c>false</c>、<c>prefix</c>も<c>null</c>は<c>true</c>を返す。</remarks>\r
-        public static bool StartsWith(string str, string prefix, int toffset)\r
-        {\r
-            // nullチェック\r
-            if (str == null)\r
-            {\r
-                return prefix == null;\r
-            }\r
-            else if (prefix == null)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 範囲チェック\r
-            if (toffset < 0 || toffset >= str.Length)\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 長さチェック\r
-            if (prefix.Length == 0)\r
-            {\r
-                return true;\r
-            }\r
-\r
-            // substringしてしまうと遅いので、先頭1文字だけは自前でチェック\r
-            if (str[toffset] != prefix[0])\r
-            {\r
-                return false;\r
-            }\r
-\r
-            // 後は普通のStartWithで処理\r
-            return str.Substring(toffset).StartsWith(prefix);\r
-        }\r
-        \r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      文字列処理に関するユーティリティクラスソース。</summary>
+//
+// <copyright file="StringUtils.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+
+    /// <summary>
+    /// 文字列処理に関するユーティリティクラスです。
+    /// </summary>
+    /// <remarks>一部メソッドは、Apache Commons Lang の StringUtils やJava標準の String を参考にしています。</remarks>
+    public static class StringUtils
+    {
+        #region 初期化メソッド
+
+        /// <summary>
+        /// 渡された文字列をチェックし、<c>null</c>だった場合には空の文字列を返します。
+        /// それ以外の場合には渡された文字列を返します。
+        /// </summary>
+        /// <param name="str">チェックを行う対象となる文字列。</param>
+        /// <returns>渡された文字列、<c>null</c>の場合には空の文字列。</returns>
+        public static string DefaultString(string str)
+        {
+            return StringUtils.DefaultString(str, String.Empty);
+        }
+
+        /// <summary>
+        /// 渡された文字列をチェックし、<c>null</c>だった場合には指定されたデフォルトの文字列を返します。
+        /// それ以外の場合には渡された文字列を返します。
+        /// </summary>
+        /// <param name="str">チェックを行う対象となる文字列。</param>
+        /// <param name="defaultString">渡された文字列が<c>null</c>の場合に返されるデフォルトの文字列。</param>
+        /// <returns>渡された文字列、<c>null</c>の場合にはデフォルトの文字列。</returns>
+        public static string DefaultString(string str, string defaultString)
+        {
+            if (str == null)
+            {
+                return defaultString;
+            }
+
+            return str;
+        }
+
+        #endregion
+
+        #region 文字列チェック
+
+        /// <summary>
+        /// この文字列の指定されたインデックス以降の部分文字列が、指定された接頭辞で始まるかどうかを判定します。
+        /// </summary>
+        /// <param name="str">チェックを行う対象となる文字列。</param>
+        /// <param name="prefix">接頭辞。</param>
+        /// <param name="toffset">この文字列の比較を開始する位置。</param>
+        /// <returns>始まる場合<c>true</c>。<c>toffset</c>が負の値の場合、<c>str</c>の長さより大きい場合<c>false</c>。それ以外で<c>prefix</c>が空の場合は<c>true</c>。</returns>
+        /// <remarks>引数の<c>null</c>は許容、<c>str</c>のみまたは<c>prefix</c>のみ<c>null</c>は<c>false</c>、<c>prefix</c>も<c>null</c>は<c>true</c>を返す。</remarks>
+        public static bool StartsWith(string str, string prefix, int toffset)
+        {
+            // nullチェック
+            if (str == null)
+            {
+                return prefix == null;
+            }
+            else if (prefix == null)
+            {
+                return false;
+            }
+
+            // 範囲チェック
+            if (toffset < 0 || toffset >= str.Length)
+            {
+                return false;
+            }
+
+            // 長さチェック
+            if (prefix.Length == 0)
+            {
+                return true;
+            }
+
+            // substringしてしまうと遅いので、先頭1文字だけは自前でチェック
+            if (str[toffset] != prefix[0])
+            {
+                return false;
+            }
+
+            // 後は普通のStartWithで処理
+            return str.Substring(toffset).StartsWith(prefix);
+        }
+        
+        #endregion
+    }
+}
index fb3176e..e70392e 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Apache Commons Lang の Validateを参考にしたユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="Validate.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-\r
-    /// <summary>\r
-    /// Apache Commons Lang の Validateを参考にしたユーティリティクラスです。\r
-    /// </summary>\r
-    /// <remarks>http://commons.apache.org/lang/api/org/apache/commons/lang/Validate.html</remarks>\r
-    public static class Validate\r
-    {\r
-        #region NotNullメソッド\r
-\r
-        /// <summary>\r
-        /// 渡されたオブジェクトをチェックし、<c>null</c>の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="obj"><c>null</c>かどうかをチェックするオブジェクト。</param>\r
-        /// <returns>渡されたオブジェクト。</returns>\r
-        /// <remarks>オブジェクトが<c>null</c>の場合に例外に渡されるパラメータ名は "value"。</remarks>\r
-        /// <exception cref="ArgumentNullException">オブジェクトが<c>null</c>。</exception>\r
-        /// <typeparam name="T">オブジェクトの型。</typeparam>\r
-        public static T NotNull<T>(T obj)\r
-        {\r
-            return Validate.NotNull(obj, "value");\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡されたオブジェクトをチェックし、<c>null</c>の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="obj"><c>null</c>かどうかをチェックするオブジェクト。</param>\r
-        /// <param name="paramName">オブジェクトが<c>null</c>の場合に例外に渡されるパラメータ名。</param>\r
-        /// <returns>渡されたオブジェクト。</returns>\r
-        /// <exception cref="ArgumentNullException">オブジェクトが<c>null</c>。</exception>\r
-        /// <typeparam name="T">オブジェクトの型。</typeparam>\r
-        public static T NotNull<T>(T obj, string paramName)\r
-        {\r
-            if (obj == null)\r
-            {\r
-                throw new ArgumentNullException(paramName);\r
-            }\r
-\r
-            return obj;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region NotEmptyメソッド\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、空(<c>null</c>または長さ0)の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="str">空かどうかをチェックする文字列。</param>\r
-        /// <returns>渡された文字列。</returns>\r
-        /// <remarks>文字列が空の場合に例外に渡されるパラメータ名は "value"。</remarks>\r
-        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>\r
-        /// <exception cref="ArgumentException">文字列が長さ0。</exception>\r
-        public static string NotEmpty(string str)\r
-        {\r
-            return Validate.NotEmpty(str, "value");\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、空(<c>null</c>または長さ0)の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="str">空かどうかをチェックする文字列。</param>\r
-        /// <param name="paramName">文字列が空の場合に例外に渡されるパラメータ名。</param>\r
-        /// <returns>渡された文字列。</returns>\r
-        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>\r
-        /// <exception cref="ArgumentException">文字列が長さ0。</exception>\r
-        public static string NotEmpty(string str, string paramName)\r
-        {\r
-            if (str == null)\r
-            {\r
-                throw new ArgumentNullException(paramName);\r
-            }\r
-            else if (str == String.Empty)\r
-            {\r
-                throw new ArgumentException("The validated string is empty", paramName);\r
-            }\r
-\r
-            return str;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region NotBlankメソッド\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、空(<c>null</c>または空か空白のみ)の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="str">空かどうかをチェックする文字列。</param>\r
-        /// <returns>渡された文字列。</returns>\r
-        /// <remarks>文字列が空の場合に例外に渡されるパラメータ名は "value"。</remarks>\r
-        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>\r
-        /// <exception cref="ArgumentException">文字列が空か空白のみ。</exception>\r
-        public static string NotBlank(string str)\r
-        {\r
-            return Validate.NotBlank(str, "value");\r
-        }\r
-\r
-        /// <summary>\r
-        /// 渡された文字列をチェックし、空(<c>null</c>または空か空白のみ)の場合に例外をスローする。\r
-        /// </summary>\r
-        /// <param name="str">空かどうかをチェックする文字列。</param>\r
-        /// <param name="paramName">文字列が空の場合に例外に渡されるパラメータ名。</param>\r
-        /// <returns>渡された文字列。</returns>\r
-        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>\r
-        /// <exception cref="ArgumentException">文字列が空か空白のみ。</exception>\r
-        public static string NotBlank(string str, string paramName)\r
-        {\r
-            if (str == null)\r
-            {\r
-                throw new ArgumentNullException(paramName);\r
-            }\r
-            else if (String.IsNullOrWhiteSpace(str))\r
-            {\r
-                throw new ArgumentException("The validated string is blank", paramName);\r
-            }\r
-\r
-            return str;\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Apache Commons Lang の Validateを参考にしたユーティリティクラスソース。</summary>
+//
+// <copyright file="Validate.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+
+    /// <summary>
+    /// Apache Commons Lang の Validateを参考にしたユーティリティクラスです。
+    /// </summary>
+    /// <remarks>http://commons.apache.org/lang/api/org/apache/commons/lang/Validate.html</remarks>
+    public static class Validate
+    {
+        #region NotNullメソッド
+
+        /// <summary>
+        /// 渡されたオブジェクトをチェックし、<c>null</c>の場合に例外をスローする。
+        /// </summary>
+        /// <param name="obj"><c>null</c>かどうかをチェックするオブジェクト。</param>
+        /// <returns>渡されたオブジェクト。</returns>
+        /// <remarks>オブジェクトが<c>null</c>の場合に例外に渡されるパラメータ名は "value"。</remarks>
+        /// <exception cref="ArgumentNullException">オブジェクトが<c>null</c>。</exception>
+        /// <typeparam name="T">オブジェクトの型。</typeparam>
+        public static T NotNull<T>(T obj)
+        {
+            return Validate.NotNull(obj, "value");
+        }
+
+        /// <summary>
+        /// 渡されたオブジェクトをチェックし、<c>null</c>の場合に例外をスローする。
+        /// </summary>
+        /// <param name="obj"><c>null</c>かどうかをチェックするオブジェクト。</param>
+        /// <param name="paramName">オブジェクトが<c>null</c>の場合に例外に渡されるパラメータ名。</param>
+        /// <returns>渡されたオブジェクト。</returns>
+        /// <exception cref="ArgumentNullException">オブジェクトが<c>null</c>。</exception>
+        /// <typeparam name="T">オブジェクトの型。</typeparam>
+        public static T NotNull<T>(T obj, string paramName)
+        {
+            if (obj == null)
+            {
+                throw new ArgumentNullException(paramName);
+            }
+
+            return obj;
+        }
+
+        #endregion
+
+        #region NotEmptyメソッド
+
+        /// <summary>
+        /// 渡された文字列をチェックし、空(<c>null</c>または長さ0)の場合に例外をスローする。
+        /// </summary>
+        /// <param name="str">空かどうかをチェックする文字列。</param>
+        /// <returns>渡された文字列。</returns>
+        /// <remarks>文字列が空の場合に例外に渡されるパラメータ名は "value"。</remarks>
+        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>
+        /// <exception cref="ArgumentException">文字列が長さ0。</exception>
+        public static string NotEmpty(string str)
+        {
+            return Validate.NotEmpty(str, "value");
+        }
+
+        /// <summary>
+        /// 渡された文字列をチェックし、空(<c>null</c>または長さ0)の場合に例外をスローする。
+        /// </summary>
+        /// <param name="str">空かどうかをチェックする文字列。</param>
+        /// <param name="paramName">文字列が空の場合に例外に渡されるパラメータ名。</param>
+        /// <returns>渡された文字列。</returns>
+        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>
+        /// <exception cref="ArgumentException">文字列が長さ0。</exception>
+        public static string NotEmpty(string str, string paramName)
+        {
+            if (str == null)
+            {
+                throw new ArgumentNullException(paramName);
+            }
+            else if (str == String.Empty)
+            {
+                throw new ArgumentException("The validated string is empty", paramName);
+            }
+
+            return str;
+        }
+
+        #endregion
+
+        #region NotBlankメソッド
+
+        /// <summary>
+        /// 渡された文字列をチェックし、空(<c>null</c>または空か空白のみ)の場合に例外をスローする。
+        /// </summary>
+        /// <param name="str">空かどうかをチェックする文字列。</param>
+        /// <returns>渡された文字列。</returns>
+        /// <remarks>文字列が空の場合に例外に渡されるパラメータ名は "value"。</remarks>
+        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>
+        /// <exception cref="ArgumentException">文字列が空か空白のみ。</exception>
+        public static string NotBlank(string str)
+        {
+            return Validate.NotBlank(str, "value");
+        }
+
+        /// <summary>
+        /// 渡された文字列をチェックし、空(<c>null</c>または空か空白のみ)の場合に例外をスローする。
+        /// </summary>
+        /// <param name="str">空かどうかをチェックする文字列。</param>
+        /// <param name="paramName">文字列が空の場合に例外に渡されるパラメータ名。</param>
+        /// <returns>渡された文字列。</returns>
+        /// <exception cref="ArgumentNullException">文字列が<c>null</c>。</exception>
+        /// <exception cref="ArgumentException">文字列が空か空白のみ。</exception>
+        public static string NotBlank(string str, string paramName)
+        {
+            if (str == null)
+            {
+                throw new ArgumentNullException(paramName);
+            }
+            else if (String.IsNullOrWhiteSpace(str))
+            {
+                throw new ArgumentException("The validated string is blank", paramName);
+            }
+
+            return str;
+        }
+
+        #endregion
+    }
+}
index 2d2ba70..d51f84d 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Xmlの処理に関するユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="XmlUtils.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Xml;\r
-\r
-    /// <summary>\r
-    /// Xmlの処理に関するユーティリティクラスです。\r
-    /// </summary>\r
-    public static class XmlUtils\r
-    {\r
-        #region null値許容メソッド\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に空の文字列を返す<c>InnerText</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>InnerText</c>するノード。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>InnerText</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
-        public static string InnerText(XmlNode node)\r
-        {\r
-            return XmlUtils.InnerText(node, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>InnerText</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>InnerText</c>するノード。<c>null</c>も可。</param>\r
-        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>InnerText</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
-        public static string InnerText(XmlNode node, string nullStr)\r
-        {\r
-            if (node == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-\r
-            return StringUtils.DefaultString(node.InnerText, nullStr);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に空の文字列を返す<c>InnerXml</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>InnerXml</c>するノード。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>InnerXml</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
-        public static string InnerXml(XmlNode node)\r
-        {\r
-            return XmlUtils.InnerXml(node, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>InnerXml</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>InnerXml</c>するノード。<c>null</c>も可。</param>\r
-        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>InnerXml</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
-        public static string InnerXml(XmlNode node, string nullStr)\r
-        {\r
-            if (node == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-\r
-            return StringUtils.DefaultString(node.InnerXml, nullStr);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に空の文字列を返す<c>OuterXml</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>OuterXml</c>するノード。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>OuterXml</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
-        public static string OuterXml(XmlNode node)\r
-        {\r
-            return XmlUtils.OuterXml(node, String.Empty);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>OuterXml</c>。\r
-        /// </summary>\r
-        /// <param name="node"><c>OuterXml</c>するノード。<c>null</c>も可。</param>\r
-        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
-        /// <returns>渡されたノードを<c>OuterXml</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
-        public static string OuterXml(XmlNode node, string nullStr)\r
-        {\r
-            if (node == null)\r
-            {\r
-                return nullStr;\r
-            }\r
-\r
-            return StringUtils.DefaultString(node.OuterXml, nullStr);\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Xmlの処理に関するユーティリティクラスソース。</summary>
+//
+// <copyright file="XmlUtils.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Xml;
+
+    /// <summary>
+    /// Xmlの処理に関するユーティリティクラスです。
+    /// </summary>
+    public static class XmlUtils
+    {
+        #region null値許容メソッド
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に空の文字列を返す<c>InnerText</c>。
+        /// </summary>
+        /// <param name="node"><c>InnerText</c>するノード。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>InnerText</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+        public static string InnerText(XmlNode node)
+        {
+            return XmlUtils.InnerText(node, String.Empty);
+        }
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>InnerText</c>。
+        /// </summary>
+        /// <param name="node"><c>InnerText</c>するノード。<c>null</c>も可。</param>
+        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>InnerText</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+        public static string InnerText(XmlNode node, string nullStr)
+        {
+            if (node == null)
+            {
+                return nullStr;
+            }
+
+            return StringUtils.DefaultString(node.InnerText, nullStr);
+        }
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に空の文字列を返す<c>InnerXml</c>。
+        /// </summary>
+        /// <param name="node"><c>InnerXml</c>するノード。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>InnerXml</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+        public static string InnerXml(XmlNode node)
+        {
+            return XmlUtils.InnerXml(node, String.Empty);
+        }
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>InnerXml</c>。
+        /// </summary>
+        /// <param name="node"><c>InnerXml</c>するノード。<c>null</c>も可。</param>
+        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>InnerXml</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+        public static string InnerXml(XmlNode node, string nullStr)
+        {
+            if (node == null)
+            {
+                return nullStr;
+            }
+
+            return StringUtils.DefaultString(node.InnerXml, nullStr);
+        }
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に空の文字列を返す<c>OuterXml</c>。
+        /// </summary>
+        /// <param name="node"><c>OuterXml</c>するノード。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>OuterXml</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+        public static string OuterXml(XmlNode node)
+        {
+            return XmlUtils.OuterXml(node, String.Empty);
+        }
+
+        /// <summary>
+        /// ノードが<c>null</c>の場合に指定された文字列を返す<c>OuterXml</c>。
+        /// </summary>
+        /// <param name="node"><c>OuterXml</c>するノード。<c>null</c>も可。</param>
+        /// <param name="nullStr">渡されたノードが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+        /// <returns>渡されたノードを<c>OuterXml</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+        public static string OuterXml(XmlNode node, string nullStr)
+        {
+            if (node == null)
+            {
+                return nullStr;
+            }
+
+            return StringUtils.DefaultString(node.OuterXml, nullStr);
+        }
+
+        #endregion
+    }
+}
index b155a4d..74426cf 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">\r
-  <PropertyGroup>\r
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
-    <ProductVersion>8.0.50727</ProductVersion>\r
-    <SchemaVersion>2.0</SchemaVersion>\r
-    <ProjectGuid>{4E20E523-0230-474C-B8F1-1E991360F5F5}</ProjectGuid>\r
-    <OutputType>WinExe</OutputType>\r
-    <AppDesignerFolder>Properties</AppDesignerFolder>\r
-    <RootNamespace>Honememo.Wptscs</RootNamespace>\r
-    <AssemblyName>wptscs</AssemblyName>\r
-    <ApplicationIcon>App.ico</ApplicationIcon>\r
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r
-    <FileUpgradeFlags>\r
-    </FileUpgradeFlags>\r
-    <OldToolsVersion>2.0</OldToolsVersion>\r
-    <UpgradeBackupLocation />\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>full</DebugType>\r
-    <Optimize>false</Optimize>\r
-    <OutputPath>bin\Debug\</OutputPath>\r
-    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <DocumentationFile>bin\Debug\wptscs.XML</DocumentationFile>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
-    <DebugType>pdbonly</DebugType>\r
-    <Optimize>true</Optimize>\r
-    <OutputPath>bin\Release\</OutputPath>\r
-    <DefineConstants>TRACE</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-  </PropertyGroup>\r
-  <ItemGroup>\r
-    <Reference Include="System" />\r
-    <Reference Include="System.Data" />\r
-    <Reference Include="System.Deployment" />\r
-    <Reference Include="System.Drawing" />\r
-    <Reference Include="System.Web" />\r
-    <Reference Include="System.Windows.Forms" />\r
-    <Reference Include="System.Xml" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Compile Include="ConfigForm.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="ConfigForm.Designer.cs">\r
-      <DependentUpon>ConfigForm.cs</DependentUpon>\r
-      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>\r
-    </Compile>\r
-    <Compile Include="Logics\Translator.cs" />\r
-    <Compile Include="Logics\MediaWikiTranslator.cs" />\r
-    <Compile Include="MainForm.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="MainForm.Designer.cs">\r
-      <DependentUpon>MainForm.cs</DependentUpon>\r
-      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>\r
-    </Compile>\r
-    <Compile Include="Models\Config.cs" />\r
-    <Compile Include="Utilities\LazyXmlParser.cs" />\r
-    <Compile Include="Models\IgnoreCaseDictionary.cs" />\r
-    <Compile Include="Models\Language.cs" />\r
-    <Compile Include="Models\MediaWiki.cs" />\r
-    <Compile Include="Models\MediaWikiPage.cs" />\r
-    <Compile Include="Models\Page.cs" />\r
-    <Compile Include="Models\TranslationDictionary.cs" />\r
-    <Compile Include="Models\TranslationTable.cs" />\r
-    <Compile Include="Models\Website.cs" />\r
-    <Compile Include="Program.cs" />\r
-    <Compile Include="Properties\AssemblyInfo.cs" />\r
-    <EmbeddedResource Include="ConfigForm.resx">\r
-      <SubType>Designer</SubType>\r
-      <DependentUpon>ConfigForm.cs</DependentUpon>\r
-    </EmbeddedResource>\r
-    <EmbeddedResource Include="MainForm.resx">\r
-      <SubType>Designer</SubType>\r
-      <DependentUpon>MainForm.cs</DependentUpon>\r
-    </EmbeddedResource>\r
-    <EmbeddedResource Include="Properties\Resources.resx">\r
-      <Generator>ResXFileCodeGenerator</Generator>\r
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r
-      <SubType>Designer</SubType>\r
-    </EmbeddedResource>\r
-    <Compile Include="Properties\Resources.Designer.cs">\r
-      <AutoGen>True</AutoGen>\r
-      <DependentUpon>Resources.resx</DependentUpon>\r
-      <DesignTime>True</DesignTime>\r
-      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>\r
-    </Compile>\r
-    <None Include="App.config" />\r
-    <None Include="Properties\Settings.settings">\r
-      <Generator>SettingsSingleFileGenerator</Generator>\r
-      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r
-    </None>\r
-    <Compile Include="Properties\Settings.Designer.cs">\r
-      <AutoGen>True</AutoGen>\r
-      <DependentUpon>Settings.settings</DependentUpon>\r
-      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r
-      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>\r
-    </Compile>\r
-    <Compile Include="Settings.cs" />\r
-    <Compile Include="Utilities\FormUtils.cs" />\r
-    <Compile Include="Utilities\ObjectUtils.cs" />\r
-    <Compile Include="Utilities\StringUtils.cs" />\r
-    <Compile Include="Utilities\Validate.cs" />\r
-    <Compile Include="Utilities\XmlUtils.cs" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Content Include="App.ico" />\r
-    <Content Include="License.txt" />\r
-    <Content Include="Readme.txt" />\r
-    <Content Include="config.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-      <SubType>Designer</SubType>\r
-    </Content>\r
-  </ItemGroup>\r
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />\r
-  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.Targets" />\r
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
-       Other similar extension points exist, see Microsoft.Common.targets.\r
-  <Target Name="BeforeBuild">\r
-  </Target>\r
-  <Target Name="AfterBuild">\r
-  </Target>\r
-  -->\r
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4E20E523-0230-474C-B8F1-1E991360F5F5}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Honememo.Wptscs</RootNamespace>
+    <AssemblyName>wptscs</AssemblyName>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\wptscs.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ConfigForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ConfigForm.Designer.cs">
+      <DependentUpon>ConfigForm.cs</DependentUpon>
+      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
+    </Compile>
+    <Compile Include="Logics\Translator.cs" />
+    <Compile Include="Logics\MediaWikiTranslator.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
+    </Compile>
+    <Compile Include="Models\Config.cs" />
+    <Compile Include="Utilities\LazyXmlParser.cs" />
+    <Compile Include="Models\IgnoreCaseDictionary.cs" />
+    <Compile Include="Models\Language.cs" />
+    <Compile Include="Models\MediaWiki.cs" />
+    <Compile Include="Models\MediaWikiPage.cs" />
+    <Compile Include="Models\Page.cs" />
+    <Compile Include="Models\TranslationDictionary.cs" />
+    <Compile Include="Models\TranslationTable.cs" />
+    <Compile Include="Models\Website.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="ConfigForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>ConfigForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
+    </Compile>
+    <None Include="App.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
+    </Compile>
+    <Compile Include="Settings.cs" />
+    <Compile Include="Utilities\FormUtils.cs" />
+    <Compile Include="Utilities\ObjectUtils.cs" />
+    <Compile Include="Utilities\StringUtils.cs" />
+    <Compile Include="Utilities\Validate.cs" />
+    <Compile Include="Utilities\XmlUtils.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+    <Content Include="License.txt" />
+    <Content Include="Readme.txt" />
+    <Content Include="config.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.Targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
 </Project>
\ No newline at end of file
index 0b9036f..596f0b6 100644 (file)
-<?xml version="1.0" encoding="utf-8" ?>\r
-<configuration>\r
-  <configSections>\r
-    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >\r
-      <section name="Honememo.Wptscs.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />\r
-    </sectionGroup>\r
-    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >\r
-      <section name="Honememo.Wptscs.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />\r
-    </sectionGroup>\r
-  </configSections>\r
-  <applicationSettings>\r
-    <Honememo.Wptscs.Properties.Settings>\r
-      <setting name="ConfigurationFile" serializeAs="String">\r
-        <value>config.xml</value>\r
-      </setting>\r
-      <setting name="DefaultUserAgent" serializeAs="String">\r
-        <value>WikipediaTranslationSupportTool/{0}.{1:D2}</value>\r
-      </setting>\r
-      <setting name="WikipediaLocation" serializeAs="String">\r
-        <value>http://{0}.wikipedia.org</value>\r
-      </setting>\r
-      <setting name="MediaWikiMagicWords" serializeAs="Xml">\r
-        <value>\r
-          <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-            xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r
-            <string>CURRENTYEAR</string>\r
-            <string>CURRENTMONTH</string>\r
-            <string>CURRENTMONTHNAME</string>\r
-            <string>CURRENTMONTHNAMEGEN</string>\r
-            <string>CURRENTMONTHABBREV</string>\r
-            <string>CURRENTDAY</string>\r
-            <string>CURRENTDAY2</string>\r
-            <string>CURRENTDOW</string>\r
-            <string>CURRENTDAYNAME</string>\r
-            <string>CURRENTTIME</string>\r
-            <string>CURRENTHOUR</string>\r
-            <string>CURRENTWEEK</string>\r
-            <string>CURRENTTIMESTAMP</string>\r
-            <string>LOCALYEAR</string>\r
-            <string>LOCALMONTH</string>\r
-            <string>LOCALMONTHNAME</string>\r
-            <string>LOCALMONTHNAMEGEN</string>\r
-            <string>LOCALMONTHABBREV</string>\r
-            <string>LOCALDAY</string>\r
-            <string>LOCALDAY2</string>\r
-            <string>LOCALDOW</string>\r
-            <string>LOCALDAYNAME</string>\r
-            <string>LOCALTIME</string>\r
-            <string>LOCALHOUR</string>\r
-            <string>LOCALWEEK</string>\r
-            <string>LOCALTIMESTAMP</string>\r
-            <string>SITENAME</string>\r
-            <string>SERVER</string>\r
-            <string>SERVERNAME</string>\r
-            <string>DIRMARK</string>\r
-            <string>DIRECTIONMARK</string>\r
-            <string>SCRIPTPATH</string>\r
-            <string>STYLEPATH</string>\r
-            <string>CURRENTVERSION</string>\r
-            <string>CONTENTLANGUAGE</string>\r
-            <string>CONTENTLANG</string>\r
-            <string>REVISIONID</string>\r
-            <string>REVISIONDAY</string>\r
-            <string>REVISIONDAY2</string>\r
-            <string>REVISIONMONTH</string>\r
-            <string>REVISIONYEAR</string>\r
-            <string>REVISIONTIMESTAMP</string>\r
-            <string>REVISIONUSER</string>\r
-            <string>PAGESIZE</string>\r
-            <string>PROTECTIONLEVEL</string>\r
-            <string>DISPLAYTITLE</string>\r
-            <string>DEFAULTSORT</string>\r
-            <string>DEFAULTSORTKEY</string>\r
-            <string>DEFAULTCATEGORYSORT</string>\r
-            <string>NUMBEROFPAGES</string>\r
-            <string>NUMBEROFARTICLES</string>\r
-            <string>NUMBEROFFILES</string>\r
-            <string>NUMBEROFEDITS</string>\r
-            <string>NUMBEROFVIEWS</string>\r
-            <string>NUMBEROFUSERS</string>\r
-            <string>NUMBEROFADMINS</string>\r
-            <string>NUMBEROFACTIVEUSERS</string>\r
-            <string>PAGESINCATEGORY</string>\r
-            <string>PAGESINCAT</string>\r
-            <string>NUMBERINGROUP</string>\r
-            <string>NUMINGROUP</string>\r
-            <string>PAGESINNS</string>\r
-            <string>PAGESINNAMESPACE</string>\r
-            <string>FULLPAGENAME</string>\r
-            <string>PAGENAME</string>\r
-            <string>BASEPAGENAME</string>\r
-            <string>SUBPAGENAME</string>\r
-            <string>SUBJECTPAGENAME</string>\r
-            <string>TALKPAGENAME</string>\r
-            <string>FULLPAGENAMEE</string>\r
-            <string>PAGENAMEE</string>\r
-            <string>BASEPAGENAMEE</string>\r
-            <string>SUBPAGENAMEE</string>\r
-            <string>SUBJECTPAGENAMEE</string>\r
-            <string>TALKPAGENAMEE</string>\r
-            <string>NAMESPACE</string>\r
-            <string>SUBJECTSPACE</string>\r
-            <string>ARTICLESPACE</string>\r
-            <string>TALKSPACE</string>\r
-            <string>NAMESPACEE</string>\r
-            <string>SUBJECTSPACEE</string>\r
-            <string>TALKSPACEE</string>\r
-            <string>localurl</string>\r
-            <string>fullurl</string>\r
-            <string>filepath</string>\r
-            <string>urlencode</string>\r
-            <string>anchorencode</string>\r
-            <string>ns</string>\r
-            <string>lc</string>\r
-            <string>lcfirst</string>\r
-            <string>uc</string>\r
-            <string>ucfirst</string>\r
-            <string>formatnum</string>\r
-            <string>#dateformat</string>\r
-            <string>#formatdate</string>\r
-            <string>padleft</string>\r
-            <string>padright</string>\r
-            <string>plural</string>\r
-            <string>grammar</string>\r
-            <string>int</string>\r
-            <string>#language</string>\r
-            <string>#special</string>\r
-            <string>#tag</string>\r
-            <string>gender</string>\r
-            <string>groupconvert</string>\r
-          </ArrayOfString>\r
-        </value>\r
-      </setting>\r
-      <setting name="MediaWikiExportPath" serializeAs="String">\r
-        <value>/wiki/Special:Export/{0}</value>\r
-      </setting>\r
-      <setting name="Bracket" serializeAs="String">\r
-        <value> ({0}) </value>\r
-      </setting>\r
-      <setting name="MediaWikiRedirect" serializeAs="String">\r
-        <value>#REDIRECT</value>\r
-      </setting>\r
-      <setting name="MediaWikiTemplateNamespace" serializeAs="String">\r
-        <value>10</value>\r
-      </setting>\r
-      <setting name="MediaWikiCategoryNamespace" serializeAs="String">\r
-        <value>14</value>\r
-      </setting>\r
-      <setting name="MediaWikiFileNamespace" serializeAs="String">\r
-        <value>6</value>\r
-      </setting>\r
-      <setting name="ConfigurationCompatible" serializeAs="String">\r
-        <value>1.0.0.0</value>\r
-      </setting>\r
-      <setting name="MediaWikiNamespacePath" serializeAs="String">\r
-        <value>/w/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|namespacealiases</value>\r
-      </setting>\r
-    </Honememo.Wptscs.Properties.Settings>\r
-  </applicationSettings>\r
-  <userSettings>\r
-    <Honememo.Wptscs.Properties.Settings>\r
-      <setting name="SaveDirectory" serializeAs="String">\r
-        <value />\r
-      </setting>\r
-      <setting name="LastSelectedSource" serializeAs="String">\r
-        <value>en</value>\r
-      </setting>\r
-      <setting name="LastSelectedTarget" serializeAs="String">\r
-        <value />\r
-      </setting>\r
-      <setting name="UserAgent" serializeAs="String">\r
-        <value />\r
-      </setting>\r
-      <setting name="Referer" serializeAs="String">\r
-        <value />\r
-      </setting>\r
-      <setting name="CacheExpire" serializeAs="String">\r
-        <value>15.00:00:00</value>\r
-      </setting>\r
-      <setting name="IsUpgraded" serializeAs="String">\r
-        <value>False</value>\r
-      </setting>\r
-      <setting name="IgnoreError" serializeAs="String">\r
-        <value>False</value>\r
-      </setting>\r
-    </Honememo.Wptscs.Properties.Settings>\r
-  </userSettings>\r
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+  <configSections>
+    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+      <section name="Honememo.Wptscs.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+    </sectionGroup>
+    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+      <section name="Honememo.Wptscs.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+    </sectionGroup>
+  </configSections>
+  <applicationSettings>
+    <Honememo.Wptscs.Properties.Settings>
+      <setting name="ConfigurationFile" serializeAs="String">
+        <value>config.xml</value>
+      </setting>
+      <setting name="DefaultUserAgent" serializeAs="String">
+        <value>WikipediaTranslationSupportTool/{0}.{1:D2}</value>
+      </setting>
+      <setting name="WikipediaLocation" serializeAs="String">
+        <value>http://{0}.wikipedia.org</value>
+      </setting>
+      <setting name="MediaWikiMagicWords" serializeAs="Xml">
+        <value>
+          <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+            <string>CURRENTYEAR</string>
+            <string>CURRENTMONTH</string>
+            <string>CURRENTMONTHNAME</string>
+            <string>CURRENTMONTHNAMEGEN</string>
+            <string>CURRENTMONTHABBREV</string>
+            <string>CURRENTDAY</string>
+            <string>CURRENTDAY2</string>
+            <string>CURRENTDOW</string>
+            <string>CURRENTDAYNAME</string>
+            <string>CURRENTTIME</string>
+            <string>CURRENTHOUR</string>
+            <string>CURRENTWEEK</string>
+            <string>CURRENTTIMESTAMP</string>
+            <string>LOCALYEAR</string>
+            <string>LOCALMONTH</string>
+            <string>LOCALMONTHNAME</string>
+            <string>LOCALMONTHNAMEGEN</string>
+            <string>LOCALMONTHABBREV</string>
+            <string>LOCALDAY</string>
+            <string>LOCALDAY2</string>
+            <string>LOCALDOW</string>
+            <string>LOCALDAYNAME</string>
+            <string>LOCALTIME</string>
+            <string>LOCALHOUR</string>
+            <string>LOCALWEEK</string>
+            <string>LOCALTIMESTAMP</string>
+            <string>SITENAME</string>
+            <string>SERVER</string>
+            <string>SERVERNAME</string>
+            <string>DIRMARK</string>
+            <string>DIRECTIONMARK</string>
+            <string>SCRIPTPATH</string>
+            <string>STYLEPATH</string>
+            <string>CURRENTVERSION</string>
+            <string>CONTENTLANGUAGE</string>
+            <string>CONTENTLANG</string>
+            <string>REVISIONID</string>
+            <string>REVISIONDAY</string>
+            <string>REVISIONDAY2</string>
+            <string>REVISIONMONTH</string>
+            <string>REVISIONYEAR</string>
+            <string>REVISIONTIMESTAMP</string>
+            <string>REVISIONUSER</string>
+            <string>PAGESIZE</string>
+            <string>PROTECTIONLEVEL</string>
+            <string>DISPLAYTITLE</string>
+            <string>DEFAULTSORT</string>
+            <string>DEFAULTSORTKEY</string>
+            <string>DEFAULTCATEGORYSORT</string>
+            <string>NUMBEROFPAGES</string>
+            <string>NUMBEROFARTICLES</string>
+            <string>NUMBEROFFILES</string>
+            <string>NUMBEROFEDITS</string>
+            <string>NUMBEROFVIEWS</string>
+            <string>NUMBEROFUSERS</string>
+            <string>NUMBEROFADMINS</string>
+            <string>NUMBEROFACTIVEUSERS</string>
+            <string>PAGESINCATEGORY</string>
+            <string>PAGESINCAT</string>
+            <string>NUMBERINGROUP</string>
+            <string>NUMINGROUP</string>
+            <string>PAGESINNS</string>
+            <string>PAGESINNAMESPACE</string>
+            <string>FULLPAGENAME</string>
+            <string>PAGENAME</string>
+            <string>BASEPAGENAME</string>
+            <string>SUBPAGENAME</string>
+            <string>SUBJECTPAGENAME</string>
+            <string>TALKPAGENAME</string>
+            <string>FULLPAGENAMEE</string>
+            <string>PAGENAMEE</string>
+            <string>BASEPAGENAMEE</string>
+            <string>SUBPAGENAMEE</string>
+            <string>SUBJECTPAGENAMEE</string>
+            <string>TALKPAGENAMEE</string>
+            <string>NAMESPACE</string>
+            <string>SUBJECTSPACE</string>
+            <string>ARTICLESPACE</string>
+            <string>TALKSPACE</string>
+            <string>NAMESPACEE</string>
+            <string>SUBJECTSPACEE</string>
+            <string>TALKSPACEE</string>
+            <string>localurl</string>
+            <string>fullurl</string>
+            <string>filepath</string>
+            <string>urlencode</string>
+            <string>anchorencode</string>
+            <string>ns</string>
+            <string>lc</string>
+            <string>lcfirst</string>
+            <string>uc</string>
+            <string>ucfirst</string>
+            <string>formatnum</string>
+            <string>#dateformat</string>
+            <string>#formatdate</string>
+            <string>padleft</string>
+            <string>padright</string>
+            <string>plural</string>
+            <string>grammar</string>
+            <string>int</string>
+            <string>#language</string>
+            <string>#special</string>
+            <string>#tag</string>
+            <string>gender</string>
+            <string>groupconvert</string>
+          </ArrayOfString>
+        </value>
+      </setting>
+      <setting name="MediaWikiExportPath" serializeAs="String">
+        <value>/wiki/Special:Export/{0}</value>
+      </setting>
+      <setting name="Bracket" serializeAs="String">
+        <value> ({0}) </value>
+      </setting>
+      <setting name="MediaWikiRedirect" serializeAs="String">
+        <value>#REDIRECT</value>
+      </setting>
+      <setting name="MediaWikiTemplateNamespace" serializeAs="String">
+        <value>10</value>
+      </setting>
+      <setting name="MediaWikiCategoryNamespace" serializeAs="String">
+        <value>14</value>
+      </setting>
+      <setting name="MediaWikiFileNamespace" serializeAs="String">
+        <value>6</value>
+      </setting>
+      <setting name="ConfigurationCompatible" serializeAs="String">
+        <value>1.0.0.0</value>
+      </setting>
+      <setting name="MediaWikiNamespacePath" serializeAs="String">
+        <value>/w/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|namespacealiases</value>
+      </setting>
+    </Honememo.Wptscs.Properties.Settings>
+  </applicationSettings>
+  <userSettings>
+    <Honememo.Wptscs.Properties.Settings>
+      <setting name="SaveDirectory" serializeAs="String">
+        <value />
+      </setting>
+      <setting name="LastSelectedSource" serializeAs="String">
+        <value>en</value>
+      </setting>
+      <setting name="LastSelectedTarget" serializeAs="String">
+        <value />
+      </setting>
+      <setting name="UserAgent" serializeAs="String">
+        <value />
+      </setting>
+      <setting name="Referer" serializeAs="String">
+        <value />
+      </setting>
+      <setting name="CacheExpire" serializeAs="String">
+        <value>15.00:00:00</value>
+      </setting>
+      <setting name="IsUpgraded" serializeAs="String">
+        <value>False</value>
+      </setting>
+      <setting name="IgnoreError" serializeAs="String">
+        <value>False</value>
+      </setting>
+    </Honememo.Wptscs.Properties.Settings>
+  </userSettings>
 </configuration>
\ No newline at end of file
index 7c12ff3..4b5a5d6 100644 (file)
-<?xml version="1.0"?>\r
-<Config>\r
-  <Translator>MediaWikiTranslator</Translator>\r
-  <Websites>\r
-    <MediaWiki>\r
-      <Location>http://ar.wikipedia.org</Location>\r
-      <Language Code="ar">\r
-        <Names>\r
-          <LanguageName Code="ar">\r
-            <Name>لغة عربية</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Arabic language</Name>\r
-            <ShortName>Arabic</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>アラビア語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/%D8%AE%D8%A7%D8%B5:%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1/{0}</ExportPath>\r
-      <Redirect>#تحويل</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/شرح">قالب:توثيق</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://de.wikipedia.org</Location>\r
-      <Language Code="de">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Deutsche Sprache</Name>\r
-            <ShortName>Deutsch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>German language</Name>\r
-            <ShortName>German</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ドイツ語</Name>\r
-            <ShortName>独</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>독일어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>德语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Spezial:Exportieren/{0}</ExportPath>\r
-      <Redirect>#WEITERLEITUNG</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://en.wikipedia.org</Location>\r
-      <Language Code="en">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Englische Sprache</Name>\r
-            <ShortName>Englisch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>English language</Name>\r
-            <ShortName>English</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma inglés</Name>\r
-            <ShortName>Inglés</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>英語</Name>\r
-            <ShortName>英</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>영어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua inglesa</Name>\r
-            <ShortName>Inglês</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>英语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://es.wikipedia.org</Location>\r
-      <Language Code="es">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Spanish language</Name>\r
-            <ShortName>Spanish</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma español</Name>\r
-            <ShortName>Español</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>スペイン語</Name>\r
-            <ShortName>西</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>에스파냐어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>西班牙语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>\r
-      <Redirect>#REDIRECCIÓN</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://fr.wikipedia.org</Location>\r
-      <Language Code="fr">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>French language</Name>\r
-            <ShortName>French</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="fr">\r
-            <Name>Français</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>フランス語</Name>\r
-            <ShortName>仏</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>프랑스어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>法语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Sp%C3%A9cial:Exporter/{0}</ExportPath>\r
-      <Redirect>#REDIRECTION</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Modèle:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://it.wikipedia.org</Location>\r
-      <Language Code="it">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Italian language</Name>\r
-            <ShortName>Italian</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="it">\r
-            <Name>Lingua italiana</Name>\r
-            <ShortName>Italiano</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>イタリア語</Name>\r
-            <ShortName>伊</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>이탈리아어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>意大利语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Speciale:Esporta/{0}</ExportPath>\r
-      <Redirect>#RINVIA</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ja.wikipedia.org</Location>\r
-      <Language Code="ja">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Japanische Sprache</Name>\r
-            <ShortName>Japanisch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Japanese language</Name>\r
-            <ShortName>Japanese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma japonés</Name>\r
-            <ShortName>Japonés</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>日本語</Name>\r
-            <ShortName>日</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>일본어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua japonesa</Name>\r
-            <ShortName>Japonês</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>日语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-        <Bracket>({0})</Bracket>\r
-      </Language>\r
-      <ExportPath>/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97/{0}</ExportPath>\r
-      <Redirect>#転送</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ko.wikipedia.org</Location>\r
-      <Language Code="ko">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Korean language</Name>\r
-            <ShortName>Korean</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>朝鮮語</Name>\r
-            <ShortName>ハングル</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>한국어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>朝鮮語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/%ED%8A%B9%EC%88%98%EA%B8%B0%EB%8A%A5:%EB%82%B4%EB%B3%B4%EB%82%B4%EA%B8%B0/{0}</ExportPath>\r
-      <Redirect>#넘겨주기</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://nl.wikipedia.org</Location>\r
-      <Language Code="nl">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Niederländisch</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Dutch</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>オランダ語</Name>\r
-            <ShortName>蘭</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="nl">\r
-            <Name>Nederlands</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Speciaal:Exporteren/{0}</ExportPath>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://pl.wikipedia.org</Location>\r
-      <Language Code="pl">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Polish_language</Name>\r
-            <ShortName>Polish</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ポーランド語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pl">\r
-            <Name>Język polski</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Specjalna:Eksport/{0}</ExportPath>\r
-      <Redirect>#PATRZ</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://pt.wikipedia.org</Location>\r
-      <Language Code="pt">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Portuguese language</Name>\r
-            <ShortName>Portuguese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ポルトガル語</Name>\r
-            <ShortName>葡</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>포르투갈어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua portuguesa</Name>\r
-            <ShortName>Português</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>葡萄牙語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>\r
-      <Redirect>#REDIRECIONAMENTO</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ru.wikipedia.org</Location>\r
-      <Language Code="ru">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Russian language</Name>\r
-            <ShortName>Russian</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ロシア語</Name>\r
-            <ShortName>露</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>러시아어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ru">\r
-            <Name>Русский язык</Name>\r
-            <ShortName>Русский</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>俄语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Служебная:Export/{0}</ExportPath>\r
-      <Redirect>#перенаправление</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://zh.wikipedia.org</Location>\r
-      <Language Code="zh">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Chinese language</Name>\r
-            <ShortName>Chinese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>中国語</Name>\r
-            <ShortName>中</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>중국어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>中文</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Special:%E5%AF%BC%E5%87%BA%E9%A1%B5%E9%9D%A2/{0}</ExportPath>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">模板:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-  </Websites>\r
-  <ItemTables />\r
-  <HeadingTable>\r
-    <Group>\r
-      <Word Lang="en">Advantages</Word>\r
-      <Word Lang="ja">利点</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Background</Word>\r
-      <Word Lang="ja">背景</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Costs</Word>\r
-      <Word Lang="ja">費用</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Criticism</Word>\r
-      <Word Lang="ja">批判</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Disadvantages</Word>\r
-      <Word Lang="ja">欠点</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Example</Word>\r
-      <Word Lang="ja">例</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Weblinks</Word>\r
-      <Word Lang="en">External links</Word>\r
-      <Word Lang="es">Enlaces externos</Word>\r
-      <Word Lang="fr">Liens externes</Word>\r
-      <Word Lang="it">Collegamenti esterni</Word>\r
-      <Word Lang="ja">外部リンク</Word>\r
-      <Word Lang="ko">바깥 고리</Word>\r
-      <Word Lang="nl">Externe links</Word>\r
-      <Word Lang="pl">Linki zewnętrzne</Word>\r
-      <Word Lang="pt">Links Externos</Word>\r
-      <Word Lang="zh">外部連結</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">History</Word>\r
-      <Word Lang="es">Historia</Word>\r
-      <Word Lang="fr">Histoire</Word>\r
-      <Word Lang="ja">歴史</Word>\r
-      <Word Lang="nl">Geschiedenis</Word>\r
-      <Word Lang="pl">Historia</Word>\r
-      <Word Lang="zh">歷史</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Quellen</Word>\r
-      <Word Lang="en">Notes</Word>\r
-      <Word Lang="es">Notas</Word>\r
-      <Word Lang="fr">Notes</Word>\r
-      <Word Lang="ja">脚注</Word>\r
-      <Word Lang="pl">Przypisy</Word>\r
-      <Word Lang="ru">Примечания</Word>\r
-      <Word Lang="zh">注釋</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Literatur</Word>\r
-      <Word Lang="en">References</Word>\r
-      <Word Lang="es">Referencias</Word>\r
-      <Word Lang="fr">Bibliographie</Word>\r
-      <Word Lang="it">Bibliografia</Word>\r
-      <Word Lang="ja">参考文献</Word>\r
-      <Word Lang="ko">참고 자료</Word>\r
-      <Word Lang="pl">Bibliografia</Word>\r
-      <Word Lang="ru">Ссылки</Word>\r
-      <Word Lang="zh">参考文献</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Siehe auch</Word>\r
-      <Word Lang="en">See Also</Word>\r
-      <Word Lang="es">Véase también</Word>\r
-      <Word Lang="fr">Voir aussi</Word>\r
-      <Word Lang="it">Voci correlate</Word>\r
-      <Word Lang="ja">関連項目</Word>\r
-      <Word Lang="ko">관련항목</Word>\r
-      <Word Lang="nl">Zie ook</Word>\r
-      <Word Lang="pt">Ver também</Word>\r
-      <Word Lang="ru">См. также</Word>\r
-      <Word Lang="zh">參見</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Theory</Word>\r
-      <Word Lang="ja">理論</Word>\r
-    </Group>\r
-  </HeadingTable>\r
+<?xml version="1.0"?>
+<Config>
+  <Translator>MediaWikiTranslator</Translator>
+  <Websites>
+    <MediaWiki>
+      <Location>http://ar.wikipedia.org</Location>
+      <Language Code="ar">
+        <Names>
+          <LanguageName Code="ar">
+            <Name>لغة عربية</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Arabic language</Name>
+            <ShortName>Arabic</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>アラビア語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/%D8%AE%D8%A7%D8%B5:%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1/{0}</ExportPath>
+      <Redirect>#تحويل</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/شرح">قالب:توثيق</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://de.wikipedia.org</Location>
+      <Language Code="de">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Deutsche Sprache</Name>
+            <ShortName>Deutsch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>German language</Name>
+            <ShortName>German</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ドイツ語</Name>
+            <ShortName>独</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>독일어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>德语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Spezial:Exportieren/{0}</ExportPath>
+      <Redirect>#WEITERLEITUNG</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://en.wikipedia.org</Location>
+      <Language Code="en">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Englische Sprache</Name>
+            <ShortName>Englisch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>English language</Name>
+            <ShortName>English</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma inglés</Name>
+            <ShortName>Inglés</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>英語</Name>
+            <ShortName>英</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>영어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua inglesa</Name>
+            <ShortName>Inglês</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>英语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://es.wikipedia.org</Location>
+      <Language Code="es">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Spanish language</Name>
+            <ShortName>Spanish</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma español</Name>
+            <ShortName>Español</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>スペイン語</Name>
+            <ShortName>西</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>에스파냐어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>西班牙语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>
+      <Redirect>#REDIRECCIÓN</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://fr.wikipedia.org</Location>
+      <Language Code="fr">
+        <Names>
+          <LanguageName Code="en">
+            <Name>French language</Name>
+            <ShortName>French</ShortName>
+          </LanguageName>
+          <LanguageName Code="fr">
+            <Name>Français</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>フランス語</Name>
+            <ShortName>仏</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>프랑스어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>法语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Sp%C3%A9cial:Exporter/{0}</ExportPath>
+      <Redirect>#REDIRECTION</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Modèle:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://it.wikipedia.org</Location>
+      <Language Code="it">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Italian language</Name>
+            <ShortName>Italian</ShortName>
+          </LanguageName>
+          <LanguageName Code="it">
+            <Name>Lingua italiana</Name>
+            <ShortName>Italiano</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>イタリア語</Name>
+            <ShortName>伊</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>이탈리아어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>意大利语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Speciale:Esporta/{0}</ExportPath>
+      <Redirect>#RINVIA</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ja.wikipedia.org</Location>
+      <Language Code="ja">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Japanische Sprache</Name>
+            <ShortName>Japanisch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Japanese language</Name>
+            <ShortName>Japanese</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma japonés</Name>
+            <ShortName>Japonés</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>日本語</Name>
+            <ShortName>日</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>일본어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua japonesa</Name>
+            <ShortName>Japonês</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>日语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+        <Bracket>({0})</Bracket>
+      </Language>
+      <ExportPath>/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97/{0}</ExportPath>
+      <Redirect>#転送</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ko.wikipedia.org</Location>
+      <Language Code="ko">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Korean language</Name>
+            <ShortName>Korean</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>朝鮮語</Name>
+            <ShortName>ハングル</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>한국어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>朝鮮語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/%ED%8A%B9%EC%88%98%EA%B8%B0%EB%8A%A5:%EB%82%B4%EB%B3%B4%EB%82%B4%EA%B8%B0/{0}</ExportPath>
+      <Redirect>#넘겨주기</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://nl.wikipedia.org</Location>
+      <Language Code="nl">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Niederländisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Dutch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>オランダ語</Name>
+            <ShortName>蘭</ShortName>
+          </LanguageName>
+          <LanguageName Code="nl">
+            <Name>Nederlands</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Speciaal:Exporteren/{0}</ExportPath>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://pl.wikipedia.org</Location>
+      <Language Code="pl">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Polish_language</Name>
+            <ShortName>Polish</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ポーランド語</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pl">
+            <Name>Język polski</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Specjalna:Eksport/{0}</ExportPath>
+      <Redirect>#PATRZ</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://pt.wikipedia.org</Location>
+      <Language Code="pt">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Portuguese language</Name>
+            <ShortName>Portuguese</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ポルトガル語</Name>
+            <ShortName>葡</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>포르투갈어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua portuguesa</Name>
+            <ShortName>Português</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>葡萄牙語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>
+      <Redirect>#REDIRECIONAMENTO</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ru.wikipedia.org</Location>
+      <Language Code="ru">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Russian language</Name>
+            <ShortName>Russian</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ロシア語</Name>
+            <ShortName>露</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>러시아어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ru">
+            <Name>Русский язык</Name>
+            <ShortName>Русский</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>俄语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Служебная:Export/{0}</ExportPath>
+      <Redirect>#перенаправление</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://zh.wikipedia.org</Location>
+      <Language Code="zh">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Chinese language</Name>
+            <ShortName>Chinese</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>中国語</Name>
+            <ShortName>中</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>중국어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>中文</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Special:%E5%AF%BC%E5%87%BA%E9%A1%B5%E9%9D%A2/{0}</ExportPath>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">模板:Documentation</DocumentationTemplate>
+    </MediaWiki>
+  </Websites>
+  <ItemTables />
+  <HeadingTable>
+    <Group>
+      <Word Lang="en">Advantages</Word>
+      <Word Lang="ja">利点</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Background</Word>
+      <Word Lang="ja">背景</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Costs</Word>
+      <Word Lang="ja">費用</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Criticism</Word>
+      <Word Lang="ja">批判</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Disadvantages</Word>
+      <Word Lang="ja">欠点</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Example</Word>
+      <Word Lang="ja">例</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Weblinks</Word>
+      <Word Lang="en">External links</Word>
+      <Word Lang="es">Enlaces externos</Word>
+      <Word Lang="fr">Liens externes</Word>
+      <Word Lang="it">Collegamenti esterni</Word>
+      <Word Lang="ja">外部リンク</Word>
+      <Word Lang="ko">바깥 고리</Word>
+      <Word Lang="nl">Externe links</Word>
+      <Word Lang="pl">Linki zewnętrzne</Word>
+      <Word Lang="pt">Links Externos</Word>
+      <Word Lang="zh">外部連結</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">History</Word>
+      <Word Lang="es">Historia</Word>
+      <Word Lang="fr">Histoire</Word>
+      <Word Lang="ja">歴史</Word>
+      <Word Lang="nl">Geschiedenis</Word>
+      <Word Lang="pl">Historia</Word>
+      <Word Lang="zh">歷史</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Quellen</Word>
+      <Word Lang="en">Notes</Word>
+      <Word Lang="es">Notas</Word>
+      <Word Lang="fr">Notes</Word>
+      <Word Lang="ja">脚注</Word>
+      <Word Lang="pl">Przypisy</Word>
+      <Word Lang="ru">Примечания</Word>
+      <Word Lang="zh">注釋</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Literatur</Word>
+      <Word Lang="en">References</Word>
+      <Word Lang="es">Referencias</Word>
+      <Word Lang="fr">Bibliographie</Word>
+      <Word Lang="it">Bibliografia</Word>
+      <Word Lang="ja">参考文献</Word>
+      <Word Lang="ko">참고 자료</Word>
+      <Word Lang="pl">Bibliografia</Word>
+      <Word Lang="ru">Ссылки</Word>
+      <Word Lang="zh">参考文献</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Siehe auch</Word>
+      <Word Lang="en">See Also</Word>
+      <Word Lang="es">Véase también</Word>
+      <Word Lang="fr">Voir aussi</Word>
+      <Word Lang="it">Voci correlate</Word>
+      <Word Lang="ja">関連項目</Word>
+      <Word Lang="ko">관련항목</Word>
+      <Word Lang="nl">Zie ook</Word>
+      <Word Lang="pt">Ver também</Word>
+      <Word Lang="ru">См. также</Word>
+      <Word Lang="zh">參見</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Theory</Word>
+      <Word Lang="ja">理論</Word>
+    </Group>
+  </HeadingTable>
 </Config>
\ No newline at end of file
index 6cfd1cc..6a3a32d 100644 (file)
@@ -1,35 +1,35 @@
-<?xml version="1.0"?>\r
-<api xmlns="http://www.mediawiki.org/xml/api/">\r
-  <query>\r
-    <namespaces>\r
-      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Media</ns>\r
-      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Special</ns>\r
-      <ns id="0" case="first-letter" content="" xml:space="preserve" />\r
-      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Talk</ns>\r
-      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">User</ns>\r
-      <ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">User talk</ns>\r
-      <ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Wikipedia</ns>\r
-      <ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Wikipedia talk</ns>\r
-      <ns id="6" case="first-letter" canonical="File" xml:space="preserve">File</ns>\r
-      <ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">File talk</ns>\r
-      <ns id="8" case="first-letter" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>\r
-      <ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">MediaWiki talk</ns>\r
-      <ns id="10" case="first-letter" subpages="" canonical="Template" xml:space="preserve">Template</ns>\r
-      <ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Template talk</ns>\r
-      <ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Help</ns>\r
-      <ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Help talk</ns>\r
-      <ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Category</ns>\r
-      <ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Category talk</ns>\r
-      <ns id="100" case="first-letter" subpages="" canonical="Portal" xml:space="preserve">Portal</ns>\r
-      <ns id="101" case="first-letter" subpages="" canonical="Portal talk" xml:space="preserve">Portal talk</ns>\r
-      <ns id="108" case="first-letter" subpages="" canonical="Book" xml:space="preserve">Book</ns>\r
-      <ns id="109" case="first-letter" subpages="" canonical="Book talk" xml:space="preserve">Book talk</ns>\r
-    </namespaces>\r
-    <namespacealiases>\r
-      <ns id="4" xml:space="preserve">WP</ns>\r
-      <ns id="5" xml:space="preserve">WT</ns>\r
-      <ns id="6" xml:space="preserve">Image</ns>\r
-      <ns id="7" xml:space="preserve">Image talk</ns>\r
-    </namespacealiases>\r
-  </query>\r
+<?xml version="1.0"?>
+<api xmlns="http://www.mediawiki.org/xml/api/">
+  <query>
+    <namespaces>
+      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Media</ns>
+      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Special</ns>
+      <ns id="0" case="first-letter" content="" xml:space="preserve" />
+      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Talk</ns>
+      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">User</ns>
+      <ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">User talk</ns>
+      <ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Wikipedia</ns>
+      <ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Wikipedia talk</ns>
+      <ns id="6" case="first-letter" canonical="File" xml:space="preserve">File</ns>
+      <ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">File talk</ns>
+      <ns id="8" case="first-letter" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>
+      <ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">MediaWiki talk</ns>
+      <ns id="10" case="first-letter" subpages="" canonical="Template" xml:space="preserve">Template</ns>
+      <ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Template talk</ns>
+      <ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Help</ns>
+      <ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Help talk</ns>
+      <ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Category</ns>
+      <ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Category talk</ns>
+      <ns id="100" case="first-letter" subpages="" canonical="Portal" xml:space="preserve">Portal</ns>
+      <ns id="101" case="first-letter" subpages="" canonical="Portal talk" xml:space="preserve">Portal talk</ns>
+      <ns id="108" case="first-letter" subpages="" canonical="Book" xml:space="preserve">Book</ns>
+      <ns id="109" case="first-letter" subpages="" canonical="Book talk" xml:space="preserve">Book talk</ns>
+    </namespaces>
+    <namespacealiases>
+      <ns id="4" xml:space="preserve">WP</ns>
+      <ns id="5" xml:space="preserve">WT</ns>
+      <ns id="6" xml:space="preserve">Image</ns>
+      <ns id="7" xml:space="preserve">Image talk</ns>
+    </namespacealiases>
+  </query>
 </api>
\ No newline at end of file
index d74445f..294045e 100644 (file)
@@ -1,49 +1,49 @@
-<?xml version="1.0"?>\r
-<api xmlns="http://www.mediawiki.org/xml/api/">\r
-  <query>\r
-    <namespaces>\r
-      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">メディア</ns>\r
-      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">特別</ns>\r
-      <ns id="0" case="first-letter" content="" xml:space="preserve" />\r
-      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">ノート</ns>\r
-      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">利用者</ns>\r
-      <ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">利用者‐会話</ns>\r
-      <ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Wikipedia</ns>\r
-      <ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Wikipedia‐ノート</ns>\r
-      <ns id="6" case="first-letter" canonical="File" xml:space="preserve">ファイル</ns>\r
-      <ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">ファイル‐ノート</ns>\r
-      <ns id="8" case="first-letter" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>\r
-      <ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">MediaWiki‐ノート</ns>\r
-      <ns id="10" case="first-letter" subpages="" canonical="Template" xml:space="preserve">Template</ns>\r
-      <ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Template‐ノート</ns>\r
-      <ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Help</ns>\r
-      <ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Help‐ノート</ns>\r
-      <ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Category</ns>\r
-      <ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Category‐ノート</ns>\r
-      <ns id="100" case="first-letter" subpages="" canonical="Portal" xml:space="preserve">Portal</ns>\r
-      <ns id="101" case="first-letter" subpages="" canonical="Portal‐ノート" xml:space="preserve">Portal‐ノート</ns>\r
-      <ns id="102" case="first-letter" subpages="" canonical="プロジェクト" xml:space="preserve">プロジェクト</ns>\r
-      <ns id="103" case="first-letter" subpages="" canonical="プロジェクト‐ノート" xml:space="preserve">プロジェクト‐ノート</ns>\r
-    </namespaces>\r
-    <namespacealiases>\r
-      <ns id="1" xml:space="preserve">トーク</ns>\r
-      <ns id="3" xml:space="preserve">利用者・トーク</ns>\r
-      <ns id="5" xml:space="preserve">Wikipedia・トーク</ns>\r
-      <ns id="7" xml:space="preserve">ファイル・トーク</ns>\r
-      <ns id="9" xml:space="preserve">MediaWiki・トーク</ns>\r
-      <ns id="10" xml:space="preserve">テンプレート</ns>\r
-      <ns id="11" xml:space="preserve">テンプレート・トーク</ns>\r
-      <ns id="12" xml:space="preserve">ヘルプ</ns>\r
-      <ns id="13" xml:space="preserve">ヘルプ・トーク</ns>\r
-      <ns id="14" xml:space="preserve">カテゴリ</ns>\r
-      <ns id="15" xml:space="preserve">カテゴリ・トーク</ns>\r
-      <ns id="101" xml:space="preserve">ポータル‐ノート</ns>\r
-      <ns id="101" xml:space="preserve">Portal・トーク</ns>\r
-      <ns id="103" xml:space="preserve">プロジェクト・トーク</ns>\r
-      <ns id="6" xml:space="preserve">Image</ns>\r
-      <ns id="7" xml:space="preserve">Image talk</ns>\r
-      <ns id="6" xml:space="preserve">画像</ns>\r
-      <ns id="7" xml:space="preserve">画像‐ノート</ns>\r
-    </namespacealiases>\r
-  </query>\r
+<?xml version="1.0"?>
+<api xmlns="http://www.mediawiki.org/xml/api/">
+  <query>
+    <namespaces>
+      <ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">メディア</ns>
+      <ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">特別</ns>
+      <ns id="0" case="first-letter" content="" xml:space="preserve" />
+      <ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">ノート</ns>
+      <ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">利用者</ns>
+      <ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">利用者‐会話</ns>
+      <ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Wikipedia</ns>
+      <ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Wikipedia‐ノート</ns>
+      <ns id="6" case="first-letter" canonical="File" xml:space="preserve">ファイル</ns>
+      <ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">ファイル‐ノート</ns>
+      <ns id="8" case="first-letter" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>
+      <ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">MediaWiki‐ノート</ns>
+      <ns id="10" case="first-letter" subpages="" canonical="Template" xml:space="preserve">Template</ns>
+      <ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Template‐ノート</ns>
+      <ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Help</ns>
+      <ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Help‐ノート</ns>
+      <ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Category</ns>
+      <ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Category‐ノート</ns>
+      <ns id="100" case="first-letter" subpages="" canonical="Portal" xml:space="preserve">Portal</ns>
+      <ns id="101" case="first-letter" subpages="" canonical="Portal‐ノート" xml:space="preserve">Portal‐ノート</ns>
+      <ns id="102" case="first-letter" subpages="" canonical="プロジェクト" xml:space="preserve">プロジェクト</ns>
+      <ns id="103" case="first-letter" subpages="" canonical="プロジェクト‐ノート" xml:space="preserve">プロジェクト‐ノート</ns>
+    </namespaces>
+    <namespacealiases>
+      <ns id="1" xml:space="preserve">トーク</ns>
+      <ns id="3" xml:space="preserve">利用者・トーク</ns>
+      <ns id="5" xml:space="preserve">Wikipedia・トーク</ns>
+      <ns id="7" xml:space="preserve">ファイル・トーク</ns>
+      <ns id="9" xml:space="preserve">MediaWiki・トーク</ns>
+      <ns id="10" xml:space="preserve">テンプレート</ns>
+      <ns id="11" xml:space="preserve">テンプレート・トーク</ns>
+      <ns id="12" xml:space="preserve">ヘルプ</ns>
+      <ns id="13" xml:space="preserve">ヘルプ・トーク</ns>
+      <ns id="14" xml:space="preserve">カテゴリ</ns>
+      <ns id="15" xml:space="preserve">カテゴリ・トーク</ns>
+      <ns id="101" xml:space="preserve">ポータル‐ノート</ns>
+      <ns id="101" xml:space="preserve">Portal・トーク</ns>
+      <ns id="103" xml:space="preserve">プロジェクト・トーク</ns>
+      <ns id="6" xml:space="preserve">Image</ns>
+      <ns id="7" xml:space="preserve">Image talk</ns>
+      <ns id="6" xml:space="preserve">画像</ns>
+      <ns id="7" xml:space="preserve">画像‐ノート</ns>
+    </namespacealiases>
+  </query>
 </api>
\ No newline at end of file
index 7c12ff3..4b5a5d6 100644 (file)
-<?xml version="1.0"?>\r
-<Config>\r
-  <Translator>MediaWikiTranslator</Translator>\r
-  <Websites>\r
-    <MediaWiki>\r
-      <Location>http://ar.wikipedia.org</Location>\r
-      <Language Code="ar">\r
-        <Names>\r
-          <LanguageName Code="ar">\r
-            <Name>لغة عربية</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Arabic language</Name>\r
-            <ShortName>Arabic</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>アラビア語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/%D8%AE%D8%A7%D8%B5:%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1/{0}</ExportPath>\r
-      <Redirect>#تحويل</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/شرح">قالب:توثيق</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://de.wikipedia.org</Location>\r
-      <Language Code="de">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Deutsche Sprache</Name>\r
-            <ShortName>Deutsch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>German language</Name>\r
-            <ShortName>German</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ドイツ語</Name>\r
-            <ShortName>独</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>독일어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>德语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Spezial:Exportieren/{0}</ExportPath>\r
-      <Redirect>#WEITERLEITUNG</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://en.wikipedia.org</Location>\r
-      <Language Code="en">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Englische Sprache</Name>\r
-            <ShortName>Englisch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>English language</Name>\r
-            <ShortName>English</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma inglés</Name>\r
-            <ShortName>Inglés</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>英語</Name>\r
-            <ShortName>英</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>영어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua inglesa</Name>\r
-            <ShortName>Inglês</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>英语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://es.wikipedia.org</Location>\r
-      <Language Code="es">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Spanish language</Name>\r
-            <ShortName>Spanish</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma español</Name>\r
-            <ShortName>Español</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>スペイン語</Name>\r
-            <ShortName>西</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>에스파냐어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>西班牙语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>\r
-      <Redirect>#REDIRECCIÓN</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://fr.wikipedia.org</Location>\r
-      <Language Code="fr">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>French language</Name>\r
-            <ShortName>French</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="fr">\r
-            <Name>Français</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>フランス語</Name>\r
-            <ShortName>仏</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>프랑스어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>法语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Sp%C3%A9cial:Exporter/{0}</ExportPath>\r
-      <Redirect>#REDIRECTION</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Modèle:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://it.wikipedia.org</Location>\r
-      <Language Code="it">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Italian language</Name>\r
-            <ShortName>Italian</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="it">\r
-            <Name>Lingua italiana</Name>\r
-            <ShortName>Italiano</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>イタリア語</Name>\r
-            <ShortName>伊</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>이탈리아어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>意大利语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Speciale:Esporta/{0}</ExportPath>\r
-      <Redirect>#RINVIA</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ja.wikipedia.org</Location>\r
-      <Language Code="ja">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Japanische Sprache</Name>\r
-            <ShortName>Japanisch</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Japanese language</Name>\r
-            <ShortName>Japanese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="es">\r
-            <Name>Idioma japonés</Name>\r
-            <ShortName>Japonés</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>日本語</Name>\r
-            <ShortName>日</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>일본어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua japonesa</Name>\r
-            <ShortName>Japonês</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>日语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-        <Bracket>({0})</Bracket>\r
-      </Language>\r
-      <ExportPath>/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97/{0}</ExportPath>\r
-      <Redirect>#転送</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ko.wikipedia.org</Location>\r
-      <Language Code="ko">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Korean language</Name>\r
-            <ShortName>Korean</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>朝鮮語</Name>\r
-            <ShortName>ハングル</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>한국어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>朝鮮語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/%ED%8A%B9%EC%88%98%EA%B8%B0%EB%8A%A5:%EB%82%B4%EB%B3%B4%EB%82%B4%EA%B8%B0/{0}</ExportPath>\r
-      <Redirect>#넘겨주기</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://nl.wikipedia.org</Location>\r
-      <Language Code="nl">\r
-        <Names>\r
-          <LanguageName Code="de">\r
-            <Name>Niederländisch</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="en">\r
-            <Name>Dutch</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>オランダ語</Name>\r
-            <ShortName>蘭</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="nl">\r
-            <Name>Nederlands</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Speciaal:Exporteren/{0}</ExportPath>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://pl.wikipedia.org</Location>\r
-      <Language Code="pl">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Polish_language</Name>\r
-            <ShortName>Polish</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ポーランド語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pl">\r
-            <Name>Język polski</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Specjalna:Eksport/{0}</ExportPath>\r
-      <Redirect>#PATRZ</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://pt.wikipedia.org</Location>\r
-      <Language Code="pt">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Portuguese language</Name>\r
-            <ShortName>Portuguese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ポルトガル語</Name>\r
-            <ShortName>葡</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>포르투갈어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="pt">\r
-            <Name>Língua portuguesa</Name>\r
-            <ShortName>Português</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>葡萄牙語</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>\r
-      <Redirect>#REDIRECIONAMENTO</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://ru.wikipedia.org</Location>\r
-      <Language Code="ru">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Russian language</Name>\r
-            <ShortName>Russian</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>ロシア語</Name>\r
-            <ShortName>露</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>러시아어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="ru">\r
-            <Name>Русский язык</Name>\r
-            <ShortName>Русский</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>俄语</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Служебная:Export/{0}</ExportPath>\r
-      <Redirect>#перенаправление</Redirect>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>\r
-    </MediaWiki>\r
-    <MediaWiki>\r
-      <Location>http://zh.wikipedia.org</Location>\r
-      <Language Code="zh">\r
-        <Names>\r
-          <LanguageName Code="en">\r
-            <Name>Chinese language</Name>\r
-            <ShortName>Chinese</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ja">\r
-            <Name>中国語</Name>\r
-            <ShortName>中</ShortName>\r
-          </LanguageName>\r
-          <LanguageName Code="ko">\r
-            <Name>중국어</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-          <LanguageName Code="zh">\r
-            <Name>中文</Name>\r
-            <ShortName />\r
-          </LanguageName>\r
-        </Names>\r
-      </Language>\r
-      <ExportPath>/wiki/Special:%E5%AF%BC%E5%87%BA%E9%A1%B5%E9%9D%A2/{0}</ExportPath>\r
-      <MagicWords />\r
-      <DocumentationTemplate DefaultPage="/doc">模板:Documentation</DocumentationTemplate>\r
-    </MediaWiki>\r
-  </Websites>\r
-  <ItemTables />\r
-  <HeadingTable>\r
-    <Group>\r
-      <Word Lang="en">Advantages</Word>\r
-      <Word Lang="ja">利点</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Background</Word>\r
-      <Word Lang="ja">背景</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Costs</Word>\r
-      <Word Lang="ja">費用</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Criticism</Word>\r
-      <Word Lang="ja">批判</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Disadvantages</Word>\r
-      <Word Lang="ja">欠点</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Example</Word>\r
-      <Word Lang="ja">例</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Weblinks</Word>\r
-      <Word Lang="en">External links</Word>\r
-      <Word Lang="es">Enlaces externos</Word>\r
-      <Word Lang="fr">Liens externes</Word>\r
-      <Word Lang="it">Collegamenti esterni</Word>\r
-      <Word Lang="ja">外部リンク</Word>\r
-      <Word Lang="ko">바깥 고리</Word>\r
-      <Word Lang="nl">Externe links</Word>\r
-      <Word Lang="pl">Linki zewnętrzne</Word>\r
-      <Word Lang="pt">Links Externos</Word>\r
-      <Word Lang="zh">外部連結</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">History</Word>\r
-      <Word Lang="es">Historia</Word>\r
-      <Word Lang="fr">Histoire</Word>\r
-      <Word Lang="ja">歴史</Word>\r
-      <Word Lang="nl">Geschiedenis</Word>\r
-      <Word Lang="pl">Historia</Word>\r
-      <Word Lang="zh">歷史</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Quellen</Word>\r
-      <Word Lang="en">Notes</Word>\r
-      <Word Lang="es">Notas</Word>\r
-      <Word Lang="fr">Notes</Word>\r
-      <Word Lang="ja">脚注</Word>\r
-      <Word Lang="pl">Przypisy</Word>\r
-      <Word Lang="ru">Примечания</Word>\r
-      <Word Lang="zh">注釋</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Literatur</Word>\r
-      <Word Lang="en">References</Word>\r
-      <Word Lang="es">Referencias</Word>\r
-      <Word Lang="fr">Bibliographie</Word>\r
-      <Word Lang="it">Bibliografia</Word>\r
-      <Word Lang="ja">参考文献</Word>\r
-      <Word Lang="ko">참고 자료</Word>\r
-      <Word Lang="pl">Bibliografia</Word>\r
-      <Word Lang="ru">Ссылки</Word>\r
-      <Word Lang="zh">参考文献</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="de">Siehe auch</Word>\r
-      <Word Lang="en">See Also</Word>\r
-      <Word Lang="es">Véase también</Word>\r
-      <Word Lang="fr">Voir aussi</Word>\r
-      <Word Lang="it">Voci correlate</Word>\r
-      <Word Lang="ja">関連項目</Word>\r
-      <Word Lang="ko">관련항목</Word>\r
-      <Word Lang="nl">Zie ook</Word>\r
-      <Word Lang="pt">Ver também</Word>\r
-      <Word Lang="ru">См. также</Word>\r
-      <Word Lang="zh">參見</Word>\r
-    </Group>\r
-    <Group>\r
-      <Word Lang="en">Theory</Word>\r
-      <Word Lang="ja">理論</Word>\r
-    </Group>\r
-  </HeadingTable>\r
+<?xml version="1.0"?>
+<Config>
+  <Translator>MediaWikiTranslator</Translator>
+  <Websites>
+    <MediaWiki>
+      <Location>http://ar.wikipedia.org</Location>
+      <Language Code="ar">
+        <Names>
+          <LanguageName Code="ar">
+            <Name>لغة عربية</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Arabic language</Name>
+            <ShortName>Arabic</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>アラビア語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/%D8%AE%D8%A7%D8%B5:%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1/{0}</ExportPath>
+      <Redirect>#تحويل</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/شرح">قالب:توثيق</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://de.wikipedia.org</Location>
+      <Language Code="de">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Deutsche Sprache</Name>
+            <ShortName>Deutsch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>German language</Name>
+            <ShortName>German</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ドイツ語</Name>
+            <ShortName>独</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>독일어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>德语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Spezial:Exportieren/{0}</ExportPath>
+      <Redirect>#WEITERLEITUNG</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://en.wikipedia.org</Location>
+      <Language Code="en">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Englische Sprache</Name>
+            <ShortName>Englisch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>English language</Name>
+            <ShortName>English</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma inglés</Name>
+            <ShortName>Inglés</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>英語</Name>
+            <ShortName>英</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>영어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua inglesa</Name>
+            <ShortName>Inglês</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>英语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://es.wikipedia.org</Location>
+      <Language Code="es">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Spanish language</Name>
+            <ShortName>Spanish</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma español</Name>
+            <ShortName>Español</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>スペイン語</Name>
+            <ShortName>西</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>에스파냐어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>西班牙语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>
+      <Redirect>#REDIRECCIÓN</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://fr.wikipedia.org</Location>
+      <Language Code="fr">
+        <Names>
+          <LanguageName Code="en">
+            <Name>French language</Name>
+            <ShortName>French</ShortName>
+          </LanguageName>
+          <LanguageName Code="fr">
+            <Name>Français</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>フランス語</Name>
+            <ShortName>仏</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>프랑스어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>法语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Sp%C3%A9cial:Exporter/{0}</ExportPath>
+      <Redirect>#REDIRECTION</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Modèle:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://it.wikipedia.org</Location>
+      <Language Code="it">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Italian language</Name>
+            <ShortName>Italian</ShortName>
+          </LanguageName>
+          <LanguageName Code="it">
+            <Name>Lingua italiana</Name>
+            <ShortName>Italiano</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>イタリア語</Name>
+            <ShortName>伊</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>이탈리아어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>意大利语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Speciale:Esporta/{0}</ExportPath>
+      <Redirect>#RINVIA</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ja.wikipedia.org</Location>
+      <Language Code="ja">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Japanische Sprache</Name>
+            <ShortName>Japanisch</ShortName>
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Japanese language</Name>
+            <ShortName>Japanese</ShortName>
+          </LanguageName>
+          <LanguageName Code="es">
+            <Name>Idioma japonés</Name>
+            <ShortName>Japonés</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>日本語</Name>
+            <ShortName>日</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>일본어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua japonesa</Name>
+            <ShortName>Japonês</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>日语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+        <Bracket>({0})</Bracket>
+      </Language>
+      <ExportPath>/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97/{0}</ExportPath>
+      <Redirect>#転送</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Template:Documentation</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ko.wikipedia.org</Location>
+      <Language Code="ko">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Korean language</Name>
+            <ShortName>Korean</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>朝鮮語</Name>
+            <ShortName>ハングル</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>한국어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>朝鮮語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/%ED%8A%B9%EC%88%98%EA%B8%B0%EB%8A%A5:%EB%82%B4%EB%B3%B4%EB%82%B4%EA%B8%B0/{0}</ExportPath>
+      <Redirect>#넘겨주기</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://nl.wikipedia.org</Location>
+      <Language Code="nl">
+        <Names>
+          <LanguageName Code="de">
+            <Name>Niederländisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Dutch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>オランダ語</Name>
+            <ShortName>蘭</ShortName>
+          </LanguageName>
+          <LanguageName Code="nl">
+            <Name>Nederlands</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Speciaal:Exporteren/{0}</ExportPath>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://pl.wikipedia.org</Location>
+      <Language Code="pl">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Polish_language</Name>
+            <ShortName>Polish</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ポーランド語</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pl">
+            <Name>Język polski</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Specjalna:Eksport/{0}</ExportPath>
+      <Redirect>#PATRZ</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://pt.wikipedia.org</Location>
+      <Language Code="pt">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Portuguese language</Name>
+            <ShortName>Portuguese</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ポルトガル語</Name>
+            <ShortName>葡</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>포르투갈어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="pt">
+            <Name>Língua portuguesa</Name>
+            <ShortName>Português</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>葡萄牙語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Especial:Exportar/{0}</ExportPath>
+      <Redirect>#REDIRECIONAMENTO</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://ru.wikipedia.org</Location>
+      <Language Code="ru">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Russian language</Name>
+            <ShortName>Russian</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ロシア語</Name>
+            <ShortName>露</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>러시아어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ru">
+            <Name>Русский язык</Name>
+            <ShortName>Русский</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>俄语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Служебная:Export/{0}</ExportPath>
+      <Redirect>#перенаправление</Redirect>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>
+    </MediaWiki>
+    <MediaWiki>
+      <Location>http://zh.wikipedia.org</Location>
+      <Language Code="zh">
+        <Names>
+          <LanguageName Code="en">
+            <Name>Chinese language</Name>
+            <ShortName>Chinese</ShortName>
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>中国語</Name>
+            <ShortName>中</ShortName>
+          </LanguageName>
+          <LanguageName Code="ko">
+            <Name>중국어</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>中文</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
+      </Language>
+      <ExportPath>/wiki/Special:%E5%AF%BC%E5%87%BA%E9%A1%B5%E9%9D%A2/{0}</ExportPath>
+      <MagicWords />
+      <DocumentationTemplate DefaultPage="/doc">模板:Documentation</DocumentationTemplate>
+    </MediaWiki>
+  </Websites>
+  <ItemTables />
+  <HeadingTable>
+    <Group>
+      <Word Lang="en">Advantages</Word>
+      <Word Lang="ja">利点</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Background</Word>
+      <Word Lang="ja">背景</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Costs</Word>
+      <Word Lang="ja">費用</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Criticism</Word>
+      <Word Lang="ja">批判</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Disadvantages</Word>
+      <Word Lang="ja">欠点</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Example</Word>
+      <Word Lang="ja">例</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Weblinks</Word>
+      <Word Lang="en">External links</Word>
+      <Word Lang="es">Enlaces externos</Word>
+      <Word Lang="fr">Liens externes</Word>
+      <Word Lang="it">Collegamenti esterni</Word>
+      <Word Lang="ja">外部リンク</Word>
+      <Word Lang="ko">바깥 고리</Word>
+      <Word Lang="nl">Externe links</Word>
+      <Word Lang="pl">Linki zewnętrzne</Word>
+      <Word Lang="pt">Links Externos</Word>
+      <Word Lang="zh">外部連結</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">History</Word>
+      <Word Lang="es">Historia</Word>
+      <Word Lang="fr">Histoire</Word>
+      <Word Lang="ja">歴史</Word>
+      <Word Lang="nl">Geschiedenis</Word>
+      <Word Lang="pl">Historia</Word>
+      <Word Lang="zh">歷史</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Quellen</Word>
+      <Word Lang="en">Notes</Word>
+      <Word Lang="es">Notas</Word>
+      <Word Lang="fr">Notes</Word>
+      <Word Lang="ja">脚注</Word>
+      <Word Lang="pl">Przypisy</Word>
+      <Word Lang="ru">Примечания</Word>
+      <Word Lang="zh">注釋</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Literatur</Word>
+      <Word Lang="en">References</Word>
+      <Word Lang="es">Referencias</Word>
+      <Word Lang="fr">Bibliographie</Word>
+      <Word Lang="it">Bibliografia</Word>
+      <Word Lang="ja">参考文献</Word>
+      <Word Lang="ko">참고 자료</Word>
+      <Word Lang="pl">Bibliografia</Word>
+      <Word Lang="ru">Ссылки</Word>
+      <Word Lang="zh">参考文献</Word>
+    </Group>
+    <Group>
+      <Word Lang="de">Siehe auch</Word>
+      <Word Lang="en">See Also</Word>
+      <Word Lang="es">Véase también</Word>
+      <Word Lang="fr">Voir aussi</Word>
+      <Word Lang="it">Voci correlate</Word>
+      <Word Lang="ja">関連項目</Word>
+      <Word Lang="ko">관련항목</Word>
+      <Word Lang="nl">Zie ook</Word>
+      <Word Lang="pt">Ver também</Word>
+      <Word Lang="ru">См. также</Word>
+      <Word Lang="zh">參見</Word>
+    </Group>
+    <Group>
+      <Word Lang="en">Theory</Word>
+      <Word Lang="ja">理論</Word>
+    </Group>
+  </HeadingTable>
 </Config>
\ No newline at end of file
index 32bb65b..b5b2831 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      MediaWikiTranslatorのテストクラスソース。</summary>\r
-//\r
-// <copyright file="MediaWikiTranslatorTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Logics\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using NUnit.Framework;\r
-    using Honememo.Tests;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Models;\r
-\r
-    /// <summary>\r
-    /// MediaWikiTranslatorのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class MediaWikiTranslatorTest\r
-    {\r
-        #region 定数\r
-\r
-        /// <summary>\r
-        /// テストデータが格納されているフォルダパス。\r
-        /// </summary>\r
-        private static readonly string testDir = "Data\\MediaWiki";\r
-\r
-        #endregion\r
-\r
-        #region テスト支援メソッド\r
-\r
-        /// <summary>\r
-        /// テスト用の値を設定したMediaWikiオブジェクトを返す。\r
-        /// </summary>\r
-        public MediaWiki GetTestServer(string language)\r
-        {\r
-            // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。\r
-            //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが\r
-            //    あるため、それについては随時期待値を調整して対処。\r
-            MediaWiki server = ObjectUtils.DefaultIfNull<MediaWiki>(\r
-                TestingConfig.GetInstance("Data\\config.xml").GetWebsite(language) as MediaWiki,\r
-                new MediaWiki(new Language(language)));\r
-            UriBuilder b = new UriBuilder("file", "");\r
-            b.Path = Path.GetFullPath(testDir) + "\\";\r
-            server.Location = new Uri(b.Uri, language + "/").ToString();\r
-            server.ExportPath = "{0}.xml";\r
-            server.NamespacePath = "_api.xml";\r
-            return server;\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region 全体テストケース\r
-\r
-        /// <summary>\r
-        /// テストデータを用い、Runを通しで実行するテストケース。基本動作。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestExampleIgnoreHeading()\r
-        {\r
-            MediaWiki from = this.GetTestServer("en");\r
-            Translator translate = new MediaWikiTranslator();\r
-            translate.From = from;\r
-            translate.To = this.GetTestServer("ja");\r
-            translate.HeadingTable = new TranslationTable();\r
-            translate.HeadingTable.From = "en";\r
-            translate.HeadingTable.To = "ja";\r
-\r
-            Assert.IsTrue(translate.Run("example"));\r
-\r
-            // テストデータの変換結果を期待される結果と比較する\r
-            string expectedText;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.txt"))) \r
-            {\r
-                expectedText = sr.ReadToEnd();\r
-            }\r
-\r
-            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Text > " + translate.Text);\r
-            Assert.AreEqual(\r
-                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),\r
-                translate.Text);\r
-\r
-            // テストデータの変換ログを期待されるログと比較する\r
-            string expectedLog;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.log")))\r
-            {\r
-                expectedLog = sr.ReadToEnd();\r
-            }\r
-\r
-            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Log > " + translate.Log);\r
-            Assert.AreEqual(\r
-                expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),\r
-                translate.Log);\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストデータを用い、Runを通しで実行するテストケース。基本動作見出しの変換含む。\r
-        /// </summary>\r
-        /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>\r
-        [Test]\r
-        public void TestExample()\r
-        {\r
-            MediaWiki from = this.GetTestServer("en");\r
-            Translator translate = new MediaWikiTranslator();\r
-            translate.From = from;\r
-            translate.To = this.GetTestServer("ja");\r
-\r
-            // 見出しの変換パターンを設定\r
-            translate.HeadingTable = new TranslationTable();\r
-            IDictionary<string, string> dic = new Dictionary<string, string>();\r
-            dic["en"] = "See also";\r
-            dic["ja"] = "関連項目";\r
-            translate.HeadingTable.Add(dic);\r
-            translate.HeadingTable.From = "en";\r
-            translate.HeadingTable.To = "ja";\r
-\r
-            Assert.IsTrue(translate.Run("example"));\r
-\r
-            // テストデータの変換結果を期待される結果と比較する\r
-            string expectedText;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.txt")))\r
-            {\r
-                expectedText = sr.ReadToEnd();\r
-            }\r
-\r
-            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);\r
-            Assert.AreEqual(\r
-                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),\r
-                translate.Text);\r
-\r
-            // テストデータの変換ログを期待されるログと比較する\r
-            string expectedLog;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.log")))\r
-            {\r
-                expectedLog = sr.ReadToEnd();\r
-            }\r
-\r
-            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);\r
-            Assert.AreEqual(\r
-                expectedLog.Replace("http://en.wikipedia.org", from.Location),\r
-                translate.Log);\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストデータを用い、Runを通しで実行するテストケース。キャッシュ使用。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestExampleWithCache()\r
-        {\r
-            MediaWiki from = this.GetTestServer("en");\r
-            Translator translate = new MediaWikiTranslator();\r
-            translate.From = from;\r
-            translate.To = this.GetTestServer("ja");\r
-\r
-            // 見出しの変換パターンを設定\r
-            translate.HeadingTable = new TranslationTable();\r
-            IDictionary<string, string> dic = new Dictionary<string, string>();\r
-            dic["en"] = "See also";\r
-            dic["ja"] = "関連項目";\r
-            translate.HeadingTable.Add(dic);\r
-            translate.HeadingTable.From = "en";\r
-            translate.HeadingTable.To = "ja";\r
-\r
-            // 以下のキャッシュパターンを指定して実行\r
-            TranslationDictionary table = new TranslationDictionary("en", "ja");\r
-            table.Add("Template:Wiktionary", new TranslationDictionary.Item { Word = "Template:Wiktionary" });\r
-            table.Add("example.org", new TranslationDictionary.Item());\r
-            table.Add(".example", new TranslationDictionary.Item { Word = "。さんぷる", Alias = ".dummy" });\r
-            table.Add("Template:Disambig", new TranslationDictionary.Item { Word = "Template:曖昧さ回避" });\r
-            translate.ItemTable = table;\r
-\r
-            Assert.IsTrue(translate.Run("example"));\r
-\r
-            // キャッシュに今回の処理で取得した内容が更新されているかを確認\r
-            Assert.IsTrue(table.ContainsKey("example.com"));\r
-            Assert.AreEqual("Example.com", table["example.com"].Word);\r
-            Assert.IsNull(table["example.com"].Alias);\r
-            Assert.IsNotNull(table["example.com"].Timestamp);\r
-            Assert.IsTrue(table.ContainsKey("Exemplum"));\r
-            Assert.IsEmpty(table["Exemplum"].Word);\r
-            Assert.IsNull(table["Exemplum"].Alias);\r
-            Assert.IsNotNull(table["Exemplum"].Timestamp);\r
-            Assert.IsTrue(table.ContainsKey("example.net"));\r
-            Assert.AreEqual("Example.com", table["example.net"].Word);\r
-            Assert.AreEqual("Example.com", table["example.net"].Alias);\r
-            Assert.IsNotNull(table["example.net"].Timestamp);\r
-\r
-            // テストデータの変換結果を期待される結果と比較する\r
-            string expectedText;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.txt")))\r
-            {\r
-                expectedText = sr.ReadToEnd();\r
-            }\r
-\r
-            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Text > " + translate.Text);\r
-            Assert.AreEqual(\r
-                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),\r
-                translate.Text);\r
-\r
-            // テストデータの変換ログを期待されるログと比較する\r
-            string expectedLog;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.log")))\r
-            {\r
-                expectedLog = sr.ReadToEnd();\r
-            }\r
-\r
-            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Log > " + translate.Log);\r
-            Assert.AreEqual(\r
-                expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),\r
-                translate.Log);\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストデータを用い、Runを通しで実行するテストケース(日本語版→英語版)。\r
-        /// </summary>\r
-        /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>\r
-        [Test]\r
-        public void TestSpaceShipTwo()\r
-        {\r
-            MediaWiki from = this.GetTestServer("ja");\r
-            Translator translate = new MediaWikiTranslator();\r
-            translate.From = from;\r
-            translate.To = this.GetTestServer("en");\r
-            translate.ItemTable = new TranslationDictionary("ja", "en");\r
-\r
-            // 見出しの変換パターンを設定\r
-            translate.HeadingTable = new TranslationTable();\r
-            IDictionary<string, string> dic = new Dictionary<string, string>();\r
-            dic["en"] = "See Also";\r
-            dic["ja"] = "関連項目";\r
-            translate.HeadingTable.Add(dic);\r
-            dic = new Dictionary<string, string>();\r
-            dic["en"] = "External links";\r
-            dic["ja"] = "外部リンク";\r
-            translate.HeadingTable.Add(dic);\r
-            dic = new Dictionary<string, string>();\r
-            dic["en"] = "Notes";\r
-            dic["ja"] = "脚注";\r
-            translate.HeadingTable.Add(dic);\r
-            translate.HeadingTable.From = "ja";\r
-            translate.HeadingTable.To = "en";\r
-\r
-            Assert.IsTrue(translate.Run("スペースシップツー"));\r
-\r
-            // テストデータの変換結果を期待される結果と比較する\r
-            string expectedText;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.txt")))\r
-            {\r
-                expectedText = sr.ReadToEnd();\r
-            }\r
-\r
-            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);\r
-            Assert.AreEqual(\r
-                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),\r
-                translate.Text);\r
-\r
-            // テストデータの変換ログを期待されるログと比較する\r
-            string expectedLog;\r
-            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.log")))\r
-            {\r
-                expectedLog = sr.ReadToEnd();\r
-            }\r
-\r
-            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
-            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);\r
-            Assert.AreEqual(\r
-                expectedLog.Replace("http://ja.wikipedia.org", from.Location),\r
-                translate.Log);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Runを通しで実行するテストケース(対象記事なし)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestPageNothing()\r
-        {\r
-            MediaWiki from = this.GetTestServer("en");\r
-            Translator translate = new MediaWikiTranslator();\r
-            translate.From = from;\r
-            translate.To = this.GetTestServer("ja");\r
-\r
-            Assert.IsFalse(translate.Run("Nothing Page"));\r
-\r
-            // 実行ログを期待されるログと比較する\r
-            Assert.AreEqual(\r
-                ("http://en.wikipedia.org より [[Nothing Page]] を取得。\r\n"\r
-                + "→ 翻訳元として指定された記事は存在しません。記事名を確認してください。")\r
-                .Replace("http://en.wikipedia.org", from.Location),\r
-                translate.Log);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 整理予定の静的メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// ChkCommentメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestChkComment()\r
-        {\r
-            // TryParseComment互換用の旧メソッド\r
-            string comment;\r
-            Assert.AreEqual(14, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 2));\r
-            Assert.AreEqual("<!-- test -->", comment);\r
-            Assert.AreEqual(15, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test --cd", 2));\r
-            Assert.AreEqual("<!-- test --cd", comment);\r
-            Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 1));\r
-            Assert.IsEmpty(comment);\r
-            Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 3));\r
-            Assert.IsEmpty(comment);\r
-        }\r
-        \r
-        /// <summary>\r
-        /// ChkNowikiメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestChkNowiki()\r
-        {\r
-            // TryParseNowiki互換用の旧メソッド\r
-            string nowiki;\r
-            Assert.AreEqual(26, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 2));\r
-            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);\r
-            Assert.AreEqual(27, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowikicd", 2));\r
-            Assert.AreEqual("<nowiki>[[test]]</nowikicd", nowiki);\r
-            Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 1));\r
-            Assert.IsEmpty(nowiki);\r
-            Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 3));\r
-            Assert.IsEmpty(nowiki);\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      MediaWikiTranslatorのテストクラスソース。</summary>
+//
+// <copyright file="MediaWikiTranslatorTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Logics
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Reflection;
+    using NUnit.Framework;
+    using Honememo.Tests;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Models;
+
+    /// <summary>
+    /// MediaWikiTranslatorのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class MediaWikiTranslatorTest
+    {
+        #region 定数
+
+        /// <summary>
+        /// テストデータが格納されているフォルダパス。
+        /// </summary>
+        private static readonly string testDir = "Data\\MediaWiki";
+
+        #endregion
+
+        #region テスト支援メソッド
+
+        /// <summary>
+        /// テスト用の値を設定したMediaWikiオブジェクトを返す。
+        /// </summary>
+        public MediaWiki GetTestServer(string language)
+        {
+            // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。
+            //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが
+            //    あるため、それについては随時期待値を調整して対処。
+            MediaWiki server = ObjectUtils.DefaultIfNull<MediaWiki>(
+                TestingConfig.GetInstance("Data\\config.xml").GetWebsite(language) as MediaWiki,
+                new MediaWiki(new Language(language)));
+            UriBuilder b = new UriBuilder("file", "");
+            b.Path = Path.GetFullPath(testDir) + "\\";
+            server.Location = new Uri(b.Uri, language + "/").ToString();
+            server.ExportPath = "{0}.xml";
+            server.NamespacePath = "_api.xml";
+            return server;
+        }
+
+        #endregion
+        
+        #region 全体テストケース
+
+        /// <summary>
+        /// テストデータを用い、Runを通しで実行するテストケース。基本動作。
+        /// </summary>
+        [Test]
+        public void TestExampleIgnoreHeading()
+        {
+            MediaWiki from = this.GetTestServer("en");
+            Translator translate = new MediaWikiTranslator();
+            translate.From = from;
+            translate.To = this.GetTestServer("ja");
+            translate.HeadingTable = new TranslationTable();
+            translate.HeadingTable.From = "en";
+            translate.HeadingTable.To = "ja";
+
+            Assert.IsTrue(translate.Run("example"));
+
+            // テストデータの変換結果を期待される結果と比較する
+            string expectedText;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.txt"))) 
+            {
+                expectedText = sr.ReadToEnd();
+            }
+
+            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Text > " + translate.Text);
+            Assert.AreEqual(
+                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),
+                translate.Text);
+
+            // テストデータの変換ログを期待されるログと比較する
+            string expectedLog;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.log")))
+            {
+                expectedLog = sr.ReadToEnd();
+            }
+
+            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Log > " + translate.Log);
+            Assert.AreEqual(
+                expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),
+                translate.Log);
+        }
+
+        /// <summary>
+        /// テストデータを用い、Runを通しで実行するテストケース。基本動作見出しの変換含む。
+        /// </summary>
+        /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>
+        [Test]
+        public void TestExample()
+        {
+            MediaWiki from = this.GetTestServer("en");
+            Translator translate = new MediaWikiTranslator();
+            translate.From = from;
+            translate.To = this.GetTestServer("ja");
+
+            // 見出しの変換パターンを設定
+            translate.HeadingTable = new TranslationTable();
+            IDictionary<string, string> dic = new Dictionary<string, string>();
+            dic["en"] = "See also";
+            dic["ja"] = "関連項目";
+            translate.HeadingTable.Add(dic);
+            translate.HeadingTable.From = "en";
+            translate.HeadingTable.To = "ja";
+
+            Assert.IsTrue(translate.Run("example"));
+
+            // テストデータの変換結果を期待される結果と比較する
+            string expectedText;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.txt")))
+            {
+                expectedText = sr.ReadToEnd();
+            }
+
+            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);
+            Assert.AreEqual(
+                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),
+                translate.Text);
+
+            // テストデータの変換ログを期待されるログと比較する
+            string expectedLog;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.log")))
+            {
+                expectedLog = sr.ReadToEnd();
+            }
+
+            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);
+            Assert.AreEqual(
+                expectedLog.Replace("http://en.wikipedia.org", from.Location),
+                translate.Log);
+        }
+
+        /// <summary>
+        /// テストデータを用い、Runを通しで実行するテストケース。キャッシュ使用。
+        /// </summary>
+        [Test]
+        public void TestExampleWithCache()
+        {
+            MediaWiki from = this.GetTestServer("en");
+            Translator translate = new MediaWikiTranslator();
+            translate.From = from;
+            translate.To = this.GetTestServer("ja");
+
+            // 見出しの変換パターンを設定
+            translate.HeadingTable = new TranslationTable();
+            IDictionary<string, string> dic = new Dictionary<string, string>();
+            dic["en"] = "See also";
+            dic["ja"] = "関連項目";
+            translate.HeadingTable.Add(dic);
+            translate.HeadingTable.From = "en";
+            translate.HeadingTable.To = "ja";
+
+            // 以下のキャッシュパターンを指定して実行
+            TranslationDictionary table = new TranslationDictionary("en", "ja");
+            table.Add("Template:Wiktionary", new TranslationDictionary.Item { Word = "Template:Wiktionary" });
+            table.Add("example.org", new TranslationDictionary.Item());
+            table.Add(".example", new TranslationDictionary.Item { Word = "。さんぷる", Alias = ".dummy" });
+            table.Add("Template:Disambig", new TranslationDictionary.Item { Word = "Template:曖昧さ回避" });
+            translate.ItemTable = table;
+
+            Assert.IsTrue(translate.Run("example"));
+
+            // キャッシュに今回の処理で取得した内容が更新されているかを確認
+            Assert.IsTrue(table.ContainsKey("example.com"));
+            Assert.AreEqual("Example.com", table["example.com"].Word);
+            Assert.IsNull(table["example.com"].Alias);
+            Assert.IsNotNull(table["example.com"].Timestamp);
+            Assert.IsTrue(table.ContainsKey("Exemplum"));
+            Assert.IsEmpty(table["Exemplum"].Word);
+            Assert.IsNull(table["Exemplum"].Alias);
+            Assert.IsNotNull(table["Exemplum"].Timestamp);
+            Assert.IsTrue(table.ContainsKey("example.net"));
+            Assert.AreEqual("Example.com", table["example.net"].Word);
+            Assert.AreEqual("Example.com", table["example.net"].Alias);
+            Assert.IsNotNull(table["example.net"].Timestamp);
+
+            // テストデータの変換結果を期待される結果と比較する
+            string expectedText;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.txt")))
+            {
+                expectedText = sr.ReadToEnd();
+            }
+
+            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Text > " + translate.Text);
+            Assert.AreEqual(
+                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),
+                translate.Text);
+
+            // テストデータの変換ログを期待されるログと比較する
+            string expectedLog;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.log")))
+            {
+                expectedLog = sr.ReadToEnd();
+            }
+
+            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Log > " + translate.Log);
+            Assert.AreEqual(
+                expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),
+                translate.Log);
+        }
+
+        /// <summary>
+        /// テストデータを用い、Runを通しで実行するテストケース(日本語版→英語版)。
+        /// </summary>
+        /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>
+        [Test]
+        public void TestSpaceShipTwo()
+        {
+            MediaWiki from = this.GetTestServer("ja");
+            Translator translate = new MediaWikiTranslator();
+            translate.From = from;
+            translate.To = this.GetTestServer("en");
+            translate.ItemTable = new TranslationDictionary("ja", "en");
+
+            // 見出しの変換パターンを設定
+            translate.HeadingTable = new TranslationTable();
+            IDictionary<string, string> dic = new Dictionary<string, string>();
+            dic["en"] = "See Also";
+            dic["ja"] = "関連項目";
+            translate.HeadingTable.Add(dic);
+            dic = new Dictionary<string, string>();
+            dic["en"] = "External links";
+            dic["ja"] = "外部リンク";
+            translate.HeadingTable.Add(dic);
+            dic = new Dictionary<string, string>();
+            dic["en"] = "Notes";
+            dic["ja"] = "脚注";
+            translate.HeadingTable.Add(dic);
+            translate.HeadingTable.From = "ja";
+            translate.HeadingTable.To = "en";
+
+            Assert.IsTrue(translate.Run("スペースシップツー"));
+
+            // テストデータの変換結果を期待される結果と比較する
+            string expectedText;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.txt")))
+            {
+                expectedText = sr.ReadToEnd();
+            }
+
+            // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);
+            Assert.AreEqual(
+                expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),
+                translate.Text);
+
+            // テストデータの変換ログを期待されるログと比較する
+            string expectedLog;
+            using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.log")))
+            {
+                expectedLog = sr.ReadToEnd();
+            }
+
+            // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
+            //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);
+            Assert.AreEqual(
+                expectedLog.Replace("http://ja.wikipedia.org", from.Location),
+                translate.Log);
+        }
+
+        /// <summary>
+        /// Runを通しで実行するテストケース(対象記事なし)。
+        /// </summary>
+        [Test]
+        public void TestPageNothing()
+        {
+            MediaWiki from = this.GetTestServer("en");
+            Translator translate = new MediaWikiTranslator();
+            translate.From = from;
+            translate.To = this.GetTestServer("ja");
+
+            Assert.IsFalse(translate.Run("Nothing Page"));
+
+            // 実行ログを期待されるログと比較する
+            Assert.AreEqual(
+                ("http://en.wikipedia.org より [[Nothing Page]] を取得。\r\n"
+                + "→ 翻訳元として指定された記事は存在しません。記事名を確認してください。")
+                .Replace("http://en.wikipedia.org", from.Location),
+                translate.Log);
+        }
+
+        #endregion
+
+        #region 整理予定の静的メソッドテストケース
+
+        /// <summary>
+        /// ChkCommentメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestChkComment()
+        {
+            // TryParseComment互換用の旧メソッド
+            string comment;
+            Assert.AreEqual(14, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 2));
+            Assert.AreEqual("<!-- test -->", comment);
+            Assert.AreEqual(15, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test --cd", 2));
+            Assert.AreEqual("<!-- test --cd", comment);
+            Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 1));
+            Assert.IsEmpty(comment);
+            Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 3));
+            Assert.IsEmpty(comment);
+        }
+        
+        /// <summary>
+        /// ChkNowikiメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestChkNowiki()
+        {
+            // TryParseNowiki互換用の旧メソッド
+            string nowiki;
+            Assert.AreEqual(26, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 2));
+            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);
+            Assert.AreEqual(27, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowikicd", 2));
+            Assert.AreEqual("<nowiki>[[test]]</nowikicd", nowiki);
+            Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 1));
+            Assert.IsEmpty(nowiki);
+            Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 3));
+            Assert.IsEmpty(nowiki);
+        }
+
+        #endregion
+    }
+}
index e385722..4bb6aa3 100644 (file)
@@ -1,92 +1,92 @@
-// ================================================================================================\r
-// <summary>\r
-//      Configのテストクラスソース。</summary>\r
-//\r
-// <copyright file="ConfigTest.cs.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-    using Honememo.Utilities;\r
-    using Honememo.Wptscs.Logics;\r
-\r
-    /// <summary>\r
-    /// Configのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class ConfigTest\r
-    {\r
-        // TODO: テストケース全然足りない\r
-\r
-        #region XMLシリアライズ用メソッドケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            // TODO: デシリアライズでも細かい動作の差異があるので、もう少しテストケースが必要\r
-            Config config;\r
-            using (Stream stream = new FileStream("Data\\config.xml", FileMode.Open, FileAccess.Read))\r
-            {\r
-                config = new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;\r
-            }\r
-\r
-            Assert.AreEqual(typeof(MediaWikiTranslator), config.Translator);\r
-            Assert.IsTrue(config.Websites.Count > 0);\r
-            Website en = config.GetWebsite("en");\r
-            Assert.IsNotNull(en);\r
-            Assert.AreEqual("http://en.wikipedia.org", en.Location);\r
-            Assert.IsTrue(en.Language.Names.ContainsKey("ja"));\r
-            // TODO: この辺も、内容の確認が必要\r
-            Assert.IsTrue(config.ItemTables.Count == 0);\r
-            Assert.IsTrue(config.HeadingTable.Count > 0);\r
-            Assert.AreEqual("関連項目", config.HeadingTable.GetWord("en", "ja", "See Also"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            // TODO: シリアライズでも細かい動作の差異があるので、もう少しテストケースが必要\r
-            Config config = new TestingConfig();\r
-            config.Translator = typeof(MediaWikiTranslator);\r
-            TranslationDictionary dic = new TranslationDictionary("en", "ja");\r
-            dic.Add("dicKey", new TranslationDictionary.Item { Word = "dicTest" });\r
-            config.ItemTables.Add(dic);\r
-            config.HeadingTable = new TranslationTable();\r
-            IDictionary<string, string> record = new SortedDictionary<string, string>();\r
-            record["recordKey"] = "recordValue";\r
-            config.HeadingTable.Add(record);\r
-            // TODO: 全然未実装\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(Config)).Serialize(w, config);\r
-            }\r
-\r
-            Assert.AreEqual("<Config><Translator>MediaWikiTranslator</Translator><Websites />"\r
-                + "<ItemTables><ItemTable From=\"en\" To=\"ja\"><Item From=\"dicKey\" To=\"dicTest\" /></ItemTable></ItemTables>"\r
-                + "<HeadingTable><Group><Word Lang=\"recordKey\">recordValue</Word></Group></HeadingTable></Config>", b.ToString());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Configのテストクラスソース。</summary>
+//
+// <copyright file="ConfigTest.cs.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Reflection;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+    using Honememo.Utilities;
+    using Honememo.Wptscs.Logics;
+
+    /// <summary>
+    /// Configのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class ConfigTest
+    {
+        // TODO: テストケース全然足りない
+
+        #region XMLシリアライズ用メソッドケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            // TODO: デシリアライズでも細かい動作の差異があるので、もう少しテストケースが必要
+            Config config;
+            using (Stream stream = new FileStream("Data\\config.xml", FileMode.Open, FileAccess.Read))
+            {
+                config = new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;
+            }
+
+            Assert.AreEqual(typeof(MediaWikiTranslator), config.Translator);
+            Assert.IsTrue(config.Websites.Count > 0);
+            Website en = config.GetWebsite("en");
+            Assert.IsNotNull(en);
+            Assert.AreEqual("http://en.wikipedia.org", en.Location);
+            Assert.IsTrue(en.Language.Names.ContainsKey("ja"));
+            // TODO: この辺も、内容の確認が必要
+            Assert.IsTrue(config.ItemTables.Count == 0);
+            Assert.IsTrue(config.HeadingTable.Count > 0);
+            Assert.AreEqual("関連項目", config.HeadingTable.GetWord("en", "ja", "See Also"));
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            // TODO: シリアライズでも細かい動作の差異があるので、もう少しテストケースが必要
+            Config config = new TestingConfig();
+            config.Translator = typeof(MediaWikiTranslator);
+            TranslationDictionary dic = new TranslationDictionary("en", "ja");
+            dic.Add("dicKey", new TranslationDictionary.Item { Word = "dicTest" });
+            config.ItemTables.Add(dic);
+            config.HeadingTable = new TranslationTable();
+            IDictionary<string, string> record = new SortedDictionary<string, string>();
+            record["recordKey"] = "recordValue";
+            config.HeadingTable.Add(record);
+            // TODO: 全然未実装
+            XmlWriterSettings settings = new XmlWriterSettings();
+            settings.OmitXmlDeclaration = true;
+
+            StringBuilder b = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b, settings))
+            {
+                new XmlSerializer(typeof(Config)).Serialize(w, config);
+            }
+
+            Assert.AreEqual("<Config><Translator>MediaWikiTranslator</Translator><Websites />"
+                + "<ItemTables><ItemTable From=\"en\" To=\"ja\"><Item From=\"dicKey\" To=\"dicTest\" /></ItemTable></ItemTables>"
+                + "<HeadingTable><Group><Word Lang=\"recordKey\">recordValue</Word></Group></HeadingTable></Config>", b.ToString());
+        }
+
+        #endregion
+    }
+}
index 8c57d7b..19f121a 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      IgnoreCaseDictionaryのテストクラスソース。</summary>\r
-//\r
-// <copyright file="IgnoreCaseDictionaryTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// IgnoreCaseDictionaryのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class IgnoreCaseDictionaryTest\r
-    {\r
-        #region コンストラクタテストケース\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(引数なし)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructor()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            Assert.AreEqual(0, d.Dictionary.Count);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(引数Dictionary)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorDictionary()\r
-        {\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner, d.Dictionary);\r
-            Assert.IsTrue(d.ContainsKey("TESTkey"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(引数Dictionary、null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestConstructorDictionaryNull()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(null);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 独自実装公開プロパティテストケース\r
-        \r
-        /// <summary>\r
-        /// Dictionaryプロパティテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestDictionary()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            d.Dictionary = inner;\r
-            Assert.AreEqual(inner, d.Dictionary);\r
-            Assert.IsTrue(d.ContainsKey("TESTkey"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// Dictionaryプロパティテストケース(null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestDictionaryNull()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            d.Dictionary = null;\r
-        }\r
\r
-        #endregion\r
-\r
-        #region ラップするインスタンスを参照するプロパティテストケース\r
-\r
-        /// <summary>\r
-        /// Keysプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestKeys()\r
-        {\r
-            // ラップするIDictionaryと同じ値であること\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner.Keys, d.Keys);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Valuesプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestValues()\r
-        {\r
-            // ラップするIDictionaryと同じ値であること\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner.Values, d.Values);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Countプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestCount()\r
-        {\r
-            // ラップするIDictionaryと同じ値であること\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner.Count, d.Count);\r
-        }\r
-        \r
-        /// <summary>\r
-        /// IsReadOnlyプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestIsReadOnly()\r
-        {\r
-            // ラップするIDictionaryと同じ値であること\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner.IsReadOnly, d.IsReadOnly);\r
-        }\r
-\r
-        #endregion\r
-        \r
-        #region 独自実装インデクサーテストケース\r
-\r
-        /// <summary>\r
-        /// thisインデクサーテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestThis()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            d["TestKey"] = "TestValue";\r
-            Assert.AreEqual("TestValue", d["TESTkey"]);\r
-            Assert.AreEqual("TestValue", d.Dictionary["TestKey"]);\r
-            d["tESTkEY"] = "TestValue2";\r
-            Assert.AreEqual("TestValue2", d["TESTkey"]);\r
-            Assert.AreEqual("TestValue2", d.Dictionary["tESTkEY"]);\r
-            Assert.IsFalse(d.Dictionary.ContainsKey("TestKey"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// thisインデクサーテストケース(get、null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestThisGetNull()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            string dymmy = d.Dictionary[null];\r
-        }\r
-\r
-        /// <summary>\r
-        /// thisインデクサーテストケース(set、null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestThisSetNull()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            d.Dictionary[null] = "TestValue";\r
-        }\r
-\r
-        /// <summary>\r
-        /// thisインデクサーテストケース(get、値なし)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(KeyNotFoundException))]\r
-        public void TestThisKeyNotFound()\r
-        {\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();\r
-            string dymmy = d.Dictionary["TestKey"];\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 独自実装メソッドテストケース\r
-\r
-        // TODO: いっぱい足りない\r
-\r
-        #endregion\r
-\r
-        #region ラップするインスタンスを参照するメソッドテストケース\r
-\r
-        /// <summary>\r
-        /// GetEnumeratorメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestGetEnumerator()\r
-        {\r
-            // ラップするIDictionaryと同じ値であること\r
-            IDictionary<string, string> inner = new Dictionary<string, string>();\r
-            inner.Add("TestKey", "TestValue");\r
-            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);\r
-            Assert.AreEqual(inner.GetEnumerator(), d.GetEnumerator());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      IgnoreCaseDictionaryのテストクラスソース。</summary>
+//
+// <copyright file="IgnoreCaseDictionaryTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// IgnoreCaseDictionaryのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class IgnoreCaseDictionaryTest
+    {
+        #region コンストラクタテストケース
+
+        /// <summary>
+        /// コンストラクタテストケース(引数なし)。
+        /// </summary>
+        [Test]
+        public void TestConstructor()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            Assert.AreEqual(0, d.Dictionary.Count);
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(引数Dictionary)。
+        /// </summary>
+        [Test]
+        public void TestConstructorDictionary()
+        {
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner, d.Dictionary);
+            Assert.IsTrue(d.ContainsKey("TESTkey"));
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(引数Dictionary、null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestConstructorDictionaryNull()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(null);
+        }
+
+        #endregion
+
+        #region 独自実装公開プロパティテストケース
+        
+        /// <summary>
+        /// Dictionaryプロパティテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestDictionary()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            d.Dictionary = inner;
+            Assert.AreEqual(inner, d.Dictionary);
+            Assert.IsTrue(d.ContainsKey("TESTkey"));
+        }
+
+        /// <summary>
+        /// Dictionaryプロパティテストケース(null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestDictionaryNull()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            d.Dictionary = null;
+        }
+        #endregion
+
+        #region ラップするインスタンスを参照するプロパティテストケース
+
+        /// <summary>
+        /// Keysプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestKeys()
+        {
+            // ラップするIDictionaryと同じ値であること
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner.Keys, d.Keys);
+        }
+
+        /// <summary>
+        /// Valuesプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestValues()
+        {
+            // ラップするIDictionaryと同じ値であること
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner.Values, d.Values);
+        }
+
+        /// <summary>
+        /// Countプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestCount()
+        {
+            // ラップするIDictionaryと同じ値であること
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner.Count, d.Count);
+        }
+        
+        /// <summary>
+        /// IsReadOnlyプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestIsReadOnly()
+        {
+            // ラップするIDictionaryと同じ値であること
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner.IsReadOnly, d.IsReadOnly);
+        }
+
+        #endregion
+        
+        #region 独自実装インデクサーテストケース
+
+        /// <summary>
+        /// thisインデクサーテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestThis()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            d["TestKey"] = "TestValue";
+            Assert.AreEqual("TestValue", d["TESTkey"]);
+            Assert.AreEqual("TestValue", d.Dictionary["TestKey"]);
+            d["tESTkEY"] = "TestValue2";
+            Assert.AreEqual("TestValue2", d["TESTkey"]);
+            Assert.AreEqual("TestValue2", d.Dictionary["tESTkEY"]);
+            Assert.IsFalse(d.Dictionary.ContainsKey("TestKey"));
+        }
+
+        /// <summary>
+        /// thisインデクサーテストケース(get、null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestThisGetNull()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            string dymmy = d.Dictionary[null];
+        }
+
+        /// <summary>
+        /// thisインデクサーテストケース(set、null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestThisSetNull()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            d.Dictionary[null] = "TestValue";
+        }
+
+        /// <summary>
+        /// thisインデクサーテストケース(get、値なし)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(KeyNotFoundException))]
+        public void TestThisKeyNotFound()
+        {
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>();
+            string dymmy = d.Dictionary["TestKey"];
+        }
+
+        #endregion
+
+        #region 独自実装メソッドテストケース
+
+        // TODO: いっぱい足りない
+
+        #endregion
+
+        #region ラップするインスタンスを参照するメソッドテストケース
+
+        /// <summary>
+        /// GetEnumeratorメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestGetEnumerator()
+        {
+            // ラップするIDictionaryと同じ値であること
+            IDictionary<string, string> inner = new Dictionary<string, string>();
+            inner.Add("TestKey", "TestValue");
+            IgnoreCaseDictionary<string> d = new IgnoreCaseDictionary<string>(inner);
+            Assert.AreEqual(inner.GetEnumerator(), d.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
index 2451c7a..c6ab8ab 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Languageのテストクラスソース。</summary>\r
-//\r
-// <copyright file="LanguageTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// Languageのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class LanguageTest\r
-    {\r
-        #region プロパティテストケース\r
-\r
-        /// <summary>\r
-        /// Codeプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestCode()\r
-        {\r
-            Language lang = new Language("en");\r
-            Assert.AreEqual("en", lang.Code);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Codeプロパティテストケース(コードがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestCodeNull()\r
-        {\r
-            Language lang = new Language(null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Codeプロパティテストケース(コードが空)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentException))]\r
-        public void TestCodeBlank()\r
-        {\r
-            Language lang = new Language(" ");\r
-        }\r
-\r
-        /// <summary>\r
-        /// Namesプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNames()\r
-        {\r
-            Language lang = new Language("en");\r
-\r
-            // 初期状態で空のディクショナリーを作成\r
-            Assert.NotNull(lang.Names);\r
-            Assert.AreEqual(0, lang.Names.Count);\r
-\r
-            Language.LanguageName name = new Language.LanguageName { Name = "テスト", ShortName = "テ" };\r
-            lang.Names.Add("ja", name);\r
-            Assert.IsTrue(lang.Names.ContainsKey("ja"));\r
-            Assert.AreEqual(name, lang.Names["ja"]);\r
-            Assert.IsFalse(lang.Names.ContainsKey("en"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// Namesプロパティテストケース(オブジェクトがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestNamesNull()\r
-        {\r
-            new Language("en").Names = null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// Bracketプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestBracket()\r
-        {\r
-            Language lang = new Language("en");\r
-\r
-            // 設定ファイルからデフォルト値が設定されていること\r
-            Assert.AreEqual(" ({0}) ", lang.Bracket);\r
-\r
-            // 設定後はそちらが有効になること\r
-            lang.Bracket = "test";\r
-            Assert.AreEqual("test", lang.Bracket);\r
-\r
-            // 消すとデフォルトが有効になること\r
-            lang.Bracket = null;\r
-            Assert.AreEqual(" ({0}) ", lang.Bracket);\r
-            lang.Bracket = "";\r
-            Assert.AreEqual(" ({0}) ", lang.Bracket);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            Language lang;\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader("<Language Code=\"ja\"><Names>"\r
-                    + "<LanguageName Code=\"en\"><Name>Japanese language</Name><ShortName>Japanese</ShortName></LanguageName>"\r
-                    + "<LanguageName Code=\"zh\"><Name>日语</Name><ShortName /></LanguageName>"\r
-                    + "</Names><Bracket>({0})</Bracket></Language>")))\r
-            {\r
-                lang = new XmlSerializer(typeof(Language)).Deserialize(r) as Language;\r
-            }\r
-            Assert.IsNotNull(lang);\r
-            Assert.AreEqual("ja", lang.Code);\r
-            Assert.AreEqual("Japanese language", lang.Names["en"].Name);\r
-            Assert.AreEqual("Japanese", lang.Names["en"].ShortName);\r
-            Assert.AreEqual("日语", lang.Names["zh"].Name);\r
-            Assert.IsEmpty(lang.Names["zh"].ShortName);\r
-            Assert.IsFalse(lang.Names.ContainsKey("ja"));\r
-            Assert.AreEqual("({0})", lang.Bracket);\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            Language lang = new Language("ja");\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(Language)).Serialize(w, lang);\r
-            }\r
-\r
-            Assert.AreEqual("<Language Code=\"ja\"><Names /><Bracket /></Language>", b.ToString());\r
-\r
-            lang.Names.Add("en", new Language.LanguageName { Name = "Japanese language", ShortName = "Japanese" });\r
-            lang.Names.Add("zh", new Language.LanguageName { Name = "日语" });\r
-            lang.Bracket = "({0})";\r
-\r
-            StringBuilder b2 = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b2, settings))\r
-            {\r
-                new XmlSerializer(typeof(Language)).Serialize(w, lang);\r
-            }\r
-\r
-            Assert.AreEqual("<Language Code=\"ja\"><Names>"\r
-                    + "<LanguageName Code=\"en\"><Name>Japanese language</Name><ShortName>Japanese</ShortName></LanguageName>"\r
-                    + "<LanguageName Code=\"zh\"><Name>日语</Name><ShortName /></LanguageName>"\r
-                    + "</Names><Bracket>({0})</Bracket></Language>", b2.ToString());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Languageのテストクラスソース。</summary>
+//
+// <copyright file="LanguageTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.IO;
+    using System.Reflection;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// Languageのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class LanguageTest
+    {
+        #region プロパティテストケース
+
+        /// <summary>
+        /// Codeプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestCode()
+        {
+            Language lang = new Language("en");
+            Assert.AreEqual("en", lang.Code);
+        }
+
+        /// <summary>
+        /// Codeプロパティテストケース(コードがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestCodeNull()
+        {
+            Language lang = new Language(null);
+        }
+
+        /// <summary>
+        /// Codeプロパティテストケース(コードが空)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestCodeBlank()
+        {
+            Language lang = new Language(" ");
+        }
+
+        /// <summary>
+        /// Namesプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestNames()
+        {
+            Language lang = new Language("en");
+
+            // 初期状態で空のディクショナリーを作成
+            Assert.NotNull(lang.Names);
+            Assert.AreEqual(0, lang.Names.Count);
+
+            Language.LanguageName name = new Language.LanguageName { Name = "テスト", ShortName = "テ" };
+            lang.Names.Add("ja", name);
+            Assert.IsTrue(lang.Names.ContainsKey("ja"));
+            Assert.AreEqual(name, lang.Names["ja"]);
+            Assert.IsFalse(lang.Names.ContainsKey("en"));
+        }
+
+        /// <summary>
+        /// Namesプロパティテストケース(オブジェクトがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestNamesNull()
+        {
+            new Language("en").Names = null;
+        }
+
+        /// <summary>
+        /// Bracketプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestBracket()
+        {
+            Language lang = new Language("en");
+
+            // 設定ファイルからデフォルト値が設定されていること
+            Assert.AreEqual(" ({0}) ", lang.Bracket);
+
+            // 設定後はそちらが有効になること
+            lang.Bracket = "test";
+            Assert.AreEqual("test", lang.Bracket);
+
+            // 消すとデフォルトが有効になること
+            lang.Bracket = null;
+            Assert.AreEqual(" ({0}) ", lang.Bracket);
+            lang.Bracket = "";
+            Assert.AreEqual(" ({0}) ", lang.Bracket);
+        }
+
+        #endregion
+
+        #region XMLシリアライズ用メソッドテストケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            Language lang;
+            using (XmlReader r = XmlReader.Create(
+                new StringReader("<Language Code=\"ja\"><Names>"
+                    + "<LanguageName Code=\"en\"><Name>Japanese language</Name><ShortName>Japanese</ShortName></LanguageName>"
+                    + "<LanguageName Code=\"zh\"><Name>日语</Name><ShortName /></LanguageName>"
+                    + "</Names><Bracket>({0})</Bracket></Language>")))
+            {
+                lang = new XmlSerializer(typeof(Language)).Deserialize(r) as Language;
+            }
+            Assert.IsNotNull(lang);
+            Assert.AreEqual("ja", lang.Code);
+            Assert.AreEqual("Japanese language", lang.Names["en"].Name);
+            Assert.AreEqual("Japanese", lang.Names["en"].ShortName);
+            Assert.AreEqual("日语", lang.Names["zh"].Name);
+            Assert.IsEmpty(lang.Names["zh"].ShortName);
+            Assert.IsFalse(lang.Names.ContainsKey("ja"));
+            Assert.AreEqual("({0})", lang.Bracket);
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            Language lang = new Language("ja");
+            XmlWriterSettings settings = new XmlWriterSettings();
+            settings.OmitXmlDeclaration = true;
+
+            StringBuilder b = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b, settings))
+            {
+                new XmlSerializer(typeof(Language)).Serialize(w, lang);
+            }
+
+            Assert.AreEqual("<Language Code=\"ja\"><Names /><Bracket /></Language>", b.ToString());
+
+            lang.Names.Add("en", new Language.LanguageName { Name = "Japanese language", ShortName = "Japanese" });
+            lang.Names.Add("zh", new Language.LanguageName { Name = "日语" });
+            lang.Bracket = "({0})";
+
+            StringBuilder b2 = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b2, settings))
+            {
+                new XmlSerializer(typeof(Language)).Serialize(w, lang);
+            }
+
+            Assert.AreEqual("<Language Code=\"ja\"><Names>"
+                    + "<LanguageName Code=\"en\"><Name>Japanese language</Name><ShortName>Japanese</ShortName></LanguageName>"
+                    + "<LanguageName Code=\"zh\"><Name>日语</Name><ShortName /></LanguageName>"
+                    + "</Names><Bracket>({0})</Bracket></Language>", b2.ToString());
+        }
+
+        #endregion
+    }
+}
index a848e05..1f30f4d 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      MediaWikiPageのテストクラスソース。</summary>\r
-//\r
-// <copyright file="MediaWikiPageTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using NUnit.Framework;\r
-    using Honememo.Tests;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// MediaWikiPageのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class MediaWikiPageTest\r
-    {\r
-        #region モッククラス\r
-\r
-        /// <summary>\r
-        /// Websiteテスト用のモッククラスです。\r
-        /// </summary>\r
-        public class DummySite : MediaWiki\r
-        {\r
-            #region コンストラクタ\r
-\r
-            /// <summary>\r
-            /// コンストラクタ。\r
-            /// </summary>\r
-            /// <param name="lang">ウェブサイトの言語。</param>\r
-            public DummySite(Language lang)\r
-                : base(lang)\r
-            {\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region ダミーメソッド\r
-\r
-            /// <summary>\r
-            /// ページを取得。\r
-            /// </summary>\r
-            /// <param name="title">ページタイトル。</param>\r
-            /// <returns>取得したページ。</returns>\r
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-            public override Page GetPage(string title)\r
-            {\r
-                System.Diagnostics.Debug.WriteLine(title);\r
-                if (title == "Template:Test/doc")\r
-                {\r
-                    return new MediaWikiPage(\r
-                        this,\r
-                        title,\r
-                        "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");\r
-                }\r
-\r
-                return base.GetPage(title);\r
-            }\r
-\r
-            #endregion\r
-        }\r
-\r
-        #endregion\r
-\r
-        // TODO: いっぱい足らない\r
-\r
-        #region 公開静的メソッドテストケース\r
-        \r
-        /// <summary>\r
-        /// TryParseNowikiメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseNowiki()\r
-        {\r
-            string nowiki;\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]</nowiki>", out nowiki));\r
-            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<NOWIKI>[[test]]</NOWIKI>", out nowiki));\r
-            Assert.AreEqual("<NOWIKI>[[test]]</NOWIKI>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<Nowiki>[[test]]</noWiki>", out nowiki));\r
-            Assert.AreEqual("<Nowiki>[[test]]</noWiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]</nowiki></nowiki>", out nowiki));\r
-            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]nowiki", out nowiki));\r
-            Assert.AreEqual("<nowiki>[[test]]nowiki", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>\n\n[[test]]\r\n</nowiki>", out nowiki));\r
-            Assert.AreEqual("<nowiki>\n\n[[test]]\r\n</nowiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--[[test]]--></nowiki>", out nowiki));\r
-            Assert.AreEqual("<nowiki><!--[[test]]--></nowiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--<nowiki>[[test]]</nowiki>--></nowiki>", out nowiki));\r
-            Assert.AreEqual("<nowiki><!--<nowiki>[[test]]</nowiki>--></nowiki>", nowiki);\r
-            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--[[test]]", out nowiki));\r
-            Assert.AreEqual("<nowiki><!--[[test]]", nowiki);\r
-            Assert.IsFalse(MediaWikiPage.TryParseNowiki("<nowik>[[test]]</nowik>", out nowiki));\r
-            Assert.IsNull(nowiki);\r
-            Assert.IsFalse(MediaWikiPage.TryParseNowiki("<nowiki[[test]]</nowiki>", out nowiki));\r
-            Assert.IsNull(nowiki);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開インスタンスメソッドテストケース\r
-\r
-        /// <summary>\r
-        /// GetInterWikiメソッドテストケース(通常ページ)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestGetInterWiki()\r
-        {\r
-            // 普通のページ\r
-            MediaWikiPage page = new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle", "TestText\n"\r
-                + " [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");\r
-            Assert.AreEqual("テストページ", page.GetInterWiki("ja"));\r
-            Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));\r
-            Assert.IsEmpty(page.GetInterWiki("de"));\r
-            Assert.IsEmpty(page.GetInterWiki("ru"));\r
-            Assert.IsEmpty(page.GetInterWiki("zh"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// GetInterWikiメソッドテストケース(Template:Documentation使用ページ)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestGetInterWikiDocumentation()\r
-        {\r
-            // Template:Documentation を使ってるページ\r
-            MediaWiki site = new DummySite(new Language("en"));\r
-            site.DocumentationTemplate = "Template:Documentation";\r
-            site.DocumentationTemplateDefaultPage = "/doc";\r
-            MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");\r
-\r
-            Assert.AreEqual("テストページ", page.GetInterWiki("ja"));\r
-            Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));\r
-            Assert.IsEmpty(page.GetInterWiki("de"));\r
-            Assert.IsEmpty(page.GetInterWiki("ru"));\r
-            Assert.IsEmpty(page.GetInterWiki("zh"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// IsRedirectメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestIsRedirect()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("en"));\r
-            MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");\r
-            Assert.IsTrue(page.IsRedirect());\r
-            Assert.AreEqual("Test Redirect", page.Redirect.Title);\r
-\r
-            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");\r
-            Assert.IsFalse(page.IsRedirect());\r
-\r
-            site.Redirect = "#転送";\r
-            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");\r
-            Assert.IsTrue(page.IsRedirect());\r
-            Assert.AreEqual("Test Redirect2", page.Redirect.Title);\r
-\r
-            page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");\r
-            Assert.IsTrue(page.IsRedirect());\r
-            Assert.AreEqual("Test Redirect3", page.Redirect.Title);\r
-\r
-            page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");\r
-            Assert.IsTrue(page.IsRedirect());\r
-            Assert.AreEqual("Test Redirect4", page.Redirect.Title);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 内部処理用インスタンスメソッドテストケース\r
-\r
-        // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施\r
-\r
-        /// <summary>\r
-        /// ValidateIncompleteメソッドテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestValidateIncomplete()\r
-        {\r
-            // 正常系は例外が発生しなければOK\r
-            PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(\r
-                new MediaWikiPage(\r
-                    new MediaWiki(new Language("en")),\r
-                    "TestTitle",\r
-                    "TestText"));\r
-            acc.SetMethod("ValidateIncomplete", new Type[0]);\r
-            acc.Invoke(new object[0]);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ValidateIncompleteメソッドテストケース(異常系)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(InvalidOperationException))]\r
-        public void TestValidateIncompleteNg()\r
-        {\r
-            // 正常系は例外が発生しなければOK\r
-            PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(\r
-                new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));\r
-            acc.SetMethod("ValidateIncomplete");\r
-            acc.Invoke();\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      MediaWikiPageのテストクラスソース。</summary>
+//
+// <copyright file="MediaWikiPageTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using NUnit.Framework;
+    using Honememo.Tests;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// MediaWikiPageのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class MediaWikiPageTest
+    {
+        #region モッククラス
+
+        /// <summary>
+        /// Websiteテスト用のモッククラスです。
+        /// </summary>
+        public class DummySite : MediaWiki
+        {
+            #region コンストラクタ
+
+            /// <summary>
+            /// コンストラクタ。
+            /// </summary>
+            /// <param name="lang">ウェブサイトの言語。</param>
+            public DummySite(Language lang)
+                : base(lang)
+            {
+            }
+
+            #endregion
+
+            #region ダミーメソッド
+
+            /// <summary>
+            /// ページを取得。
+            /// </summary>
+            /// <param name="title">ページタイトル。</param>
+            /// <returns>取得したページ。</returns>
+            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+            public override Page GetPage(string title)
+            {
+                System.Diagnostics.Debug.WriteLine(title);
+                if (title == "Template:Test/doc")
+                {
+                    return new MediaWikiPage(
+                        this,
+                        title,
+                        "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
+                }
+
+                return base.GetPage(title);
+            }
+
+            #endregion
+        }
+
+        #endregion
+
+        // TODO: いっぱい足らない
+
+        #region 公開静的メソッドテストケース
+        
+        /// <summary>
+        /// TryParseNowikiメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestTryParseNowiki()
+        {
+            string nowiki;
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]</nowiki>", out nowiki));
+            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<NOWIKI>[[test]]</NOWIKI>", out nowiki));
+            Assert.AreEqual("<NOWIKI>[[test]]</NOWIKI>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<Nowiki>[[test]]</noWiki>", out nowiki));
+            Assert.AreEqual("<Nowiki>[[test]]</noWiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]</nowiki></nowiki>", out nowiki));
+            Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>[[test]]nowiki", out nowiki));
+            Assert.AreEqual("<nowiki>[[test]]nowiki", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki>\n\n[[test]]\r\n</nowiki>", out nowiki));
+            Assert.AreEqual("<nowiki>\n\n[[test]]\r\n</nowiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--[[test]]--></nowiki>", out nowiki));
+            Assert.AreEqual("<nowiki><!--[[test]]--></nowiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--<nowiki>[[test]]</nowiki>--></nowiki>", out nowiki));
+            Assert.AreEqual("<nowiki><!--<nowiki>[[test]]</nowiki>--></nowiki>", nowiki);
+            Assert.IsTrue(MediaWikiPage.TryParseNowiki("<nowiki><!--[[test]]", out nowiki));
+            Assert.AreEqual("<nowiki><!--[[test]]", nowiki);
+            Assert.IsFalse(MediaWikiPage.TryParseNowiki("<nowik>[[test]]</nowik>", out nowiki));
+            Assert.IsNull(nowiki);
+            Assert.IsFalse(MediaWikiPage.TryParseNowiki("<nowiki[[test]]</nowiki>", out nowiki));
+            Assert.IsNull(nowiki);
+        }
+
+        #endregion
+
+        #region 公開インスタンスメソッドテストケース
+
+        /// <summary>
+        /// GetInterWikiメソッドテストケース(通常ページ)。
+        /// </summary>
+        [Test]
+        public void TestGetInterWiki()
+        {
+            // 普通のページ
+            MediaWikiPage page = new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle", "TestText\n"
+                + " [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
+            Assert.AreEqual("テストページ", page.GetInterWiki("ja"));
+            Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));
+            Assert.IsEmpty(page.GetInterWiki("de"));
+            Assert.IsEmpty(page.GetInterWiki("ru"));
+            Assert.IsEmpty(page.GetInterWiki("zh"));
+        }
+
+        /// <summary>
+        /// GetInterWikiメソッドテストケース(Template:Documentation使用ページ)。
+        /// </summary>
+        [Test]
+        public void TestGetInterWikiDocumentation()
+        {
+            // Template:Documentation を使ってるページ
+            MediaWiki site = new DummySite(new Language("en"));
+            site.DocumentationTemplate = "Template:Documentation";
+            site.DocumentationTemplateDefaultPage = "/doc";
+            MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
+
+            Assert.AreEqual("テストページ", page.GetInterWiki("ja"));
+            Assert.AreEqual("Test_Fr", page.GetInterWiki("fr"));
+            Assert.IsEmpty(page.GetInterWiki("de"));
+            Assert.IsEmpty(page.GetInterWiki("ru"));
+            Assert.IsEmpty(page.GetInterWiki("zh"));
+        }
+
+        /// <summary>
+        /// IsRedirectメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestIsRedirect()
+        {
+            MediaWiki site = new MediaWiki(new Language("en"));
+            MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");
+            Assert.IsTrue(page.IsRedirect());
+            Assert.AreEqual("Test Redirect", page.Redirect.Title);
+
+            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
+            Assert.IsFalse(page.IsRedirect());
+
+            site.Redirect = "#転送";
+            page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
+            Assert.IsTrue(page.IsRedirect());
+            Assert.AreEqual("Test Redirect2", page.Redirect.Title);
+
+            page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
+            Assert.IsTrue(page.IsRedirect());
+            Assert.AreEqual("Test Redirect3", page.Redirect.Title);
+
+            page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
+            Assert.IsTrue(page.IsRedirect());
+            Assert.AreEqual("Test Redirect4", page.Redirect.Title);
+        }
+
+        #endregion
+
+        #region 内部処理用インスタンスメソッドテストケース
+
+        // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
+
+        /// <summary>
+        /// ValidateIncompleteメソッドテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestValidateIncomplete()
+        {
+            // 正常系は例外が発生しなければOK
+            PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
+                new MediaWikiPage(
+                    new MediaWiki(new Language("en")),
+                    "TestTitle",
+                    "TestText"));
+            acc.SetMethod("ValidateIncomplete", new Type[0]);
+            acc.Invoke(new object[0]);
+        }
+
+        /// <summary>
+        /// ValidateIncompleteメソッドテストケース(異常系)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(InvalidOperationException))]
+        public void TestValidateIncompleteNg()
+        {
+            // 正常系は例外が発生しなければOK
+            PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
+                new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));
+            acc.SetMethod("ValidateIncomplete");
+            acc.Invoke();
+        }
+
+        #endregion
+    }
+}
index 6ea29ae..f8909d6 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      MediaWikiのテストクラスソース。</summary>\r
-//\r
-// <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// MediaWikiのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class MediaWikiTest\r
-    {\r
-        #region 定数\r
-\r
-        /// <summary>\r
-        /// テストデータが格納されているフォルダパス。\r
-        /// </summary>\r
-        private static readonly string testDir = "Data\\MediaWiki";\r
-\r
-        #endregion\r
-\r
-        #region テスト支援メソッド\r
-\r
-        /// <summary>\r
-        /// テスト用の値を設定したMediaWikiオブジェクトを返す。\r
-        /// </summary>\r
-        public MediaWiki GetTestServer(string language)\r
-        {\r
-            // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。\r
-            //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが\r
-            //    あるため、それについては随時期待値を調整して対処。\r
-            UriBuilder b = new UriBuilder("file", "");\r
-            b.Path = Path.GetFullPath(testDir) + "\\";\r
-            MediaWiki server = new MediaWiki(new Language(language), new Uri(b.Uri, language + "/").ToString());\r
-            server.ExportPath = "{0}.xml";\r
-            server.NamespacePath = "_api.xml";\r
-            return server;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタテストケース\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(MediaWiki全般)テストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorLanguageLocation()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("en"), "test");\r
-            Assert.AreEqual("en", site.Language.Code);\r
-            Assert.AreEqual("test", site.Location);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestConstructorLanguageLocationByLanguageNull()\r
-        {\r
-            MediaWiki site = new MediaWiki(null, "test");\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestConstructorLanguageLocationByLocationNull()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("en"), null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(Wikipedia用)テストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorLanguage()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("en"));\r
-            Assert.AreEqual("en", site.Language.Code);\r
-            Assert.AreEqual("http://en.wikipedia.org", site.Location);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestConstructorLanguageByLanguageNull()\r
-        {\r
-            MediaWiki site = new MediaWiki(null);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 設定ファイルに初期値を持つプロパティテストケース\r
-\r
-        /// <summary>\r
-        /// NamespacePathプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNamespacePath()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);\r
-            // 値を設定するとその値が返る\r
-            site.NamespacePath = "test";\r
-            Assert.AreEqual("test", site.NamespacePath);\r
-            // 空またはnullの場合、再び設定ファイルの値が入る\r
-            site.NamespacePath = null;\r
-            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);\r
-            site.NamespacePath = String.Empty;\r
-            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);\r
-        }\r
-\r
-        /// <summary>\r
-        /// ExportPathプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestExportPath()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);\r
-            // 値を設定するとその値が返る\r
-            site.ExportPath = "test";\r
-            Assert.AreEqual("test", site.ExportPath);\r
-            // 空またはnullの場合、再び設定ファイルの値が入る\r
-            site.ExportPath = null;\r
-            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);\r
-            site.ExportPath = String.Empty;\r
-            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Redirectプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestRedirect()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual("#REDIRECT", site.Redirect);\r
-            // 値を設定するとその値が返る\r
-            site.Redirect = "test";\r
-            Assert.AreEqual("test", site.Redirect);\r
-            // 空またはnullの場合、再び設定ファイルの値が入る\r
-            site.Redirect = null;\r
-            Assert.AreEqual("#REDIRECT", site.Redirect);\r
-            site.Redirect = String.Empty;\r
-            Assert.AreEqual("#REDIRECT", site.Redirect);\r
-        }\r
-\r
-        /// <summary>\r
-        /// TemplateNamespaceプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTemplateNamespace()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual(10, site.TemplateNamespace);\r
-            // 値を設定するとその値が返る\r
-            site.TemplateNamespace = -1;\r
-            Assert.AreEqual(-1, site.TemplateNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// CategoryNamespaceプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestCategoryNamespace()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual(14, site.CategoryNamespace);\r
-            // 値を設定するとその値が返る\r
-            site.CategoryNamespace = -1;\r
-            Assert.AreEqual(-1, site.CategoryNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// FileNamespaceプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestFileNamespace()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.AreEqual(6, site.FileNamespace);\r
-            // 値を設定するとその値が返る\r
-            site.FileNamespace = -1;\r
-            Assert.AreEqual(-1, site.FileNamespace);\r
-        }\r
-\r
-        /// <summary>\r
-        /// MagicWordsプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestMagicWords()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは設定ファイルの値が返される\r
-            Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));\r
-            // 値を設定するとその値が返る\r
-            site.MagicWords = new string[0];\r
-            Assert.AreEqual(0, site.MagicWords.Count);\r
-            // nullの場合、再び設定ファイルの値が入る\r
-            site.MagicWords = null;\r
-            Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region それ以外のプロパティテストケース\r
-\r
-        /// <summary>\r
-        /// Namespacesプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNamespaces()\r
-        {\r
-            MediaWiki site = this.GetTestServer("en");\r
-            // デフォルトではサーバーからダウンロードした値が返される\r
-            IList<string> names = site.Namespaces[6];\r
-            Assert.AreEqual("File", names[0]);\r
-            Assert.AreEqual("File", names[1]);\r
-            Assert.AreEqual("Image", names[2]);\r
-            // 値を設定するとその値が返る\r
-            IDictionary<int, IList<string>> dic = new Dictionary<int, IList<string>>();\r
-            dic.Add(1, new string[]{"test"});\r
-            site.Namespaces = dic;\r
-            Assert.AreEqual(1, site.Namespaces.Count);\r
-            // 空の場合、再び設定ファイルの値が入る\r
-            site.Namespaces = new Dictionary<int, IList<string>>();\r
-            Assert.AreEqual("File", names[0]);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Namespacesプロパティテストケース(null)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestNamespacesNull()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            site.Namespaces = null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// DocumentationTemplateプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestDocumentationTemplate()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは空\r
-            Assert.IsNullOrEmpty(site.DocumentationTemplate);\r
-            // その値が返る\r
-            site.DocumentationTemplate = "Template:Documentation";\r
-            Assert.AreEqual("Template:Documentation", site.DocumentationTemplate);\r
-        }\r
-\r
-        /// <summary>\r
-        /// DocumentationTemplateDefaultPageプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestDocumentationTemplateDefaultPage()\r
-        {\r
-            MediaWiki site = new MediaWiki(new Language("ja"));\r
-            // デフォルトでは空\r
-            Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);\r
-            // その値が返る\r
-            site.DocumentationTemplateDefaultPage = "/doc";\r
-            Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// GetPageプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestGetPage()\r
-        {\r
-            MediaWiki site = this.GetTestServer("en");\r
-            Page page = site.GetPage("example");\r
-            Assert.IsInstanceOf(typeof(MediaWikiPage), page);\r
-            Assert.AreEqual("Example", page.Title);\r
-            Assert.AreEqual(DateTime.Parse("2010/07/13 09:49:18"), page.Timestamp);\r
-            Assert.IsNotEmpty(page.Text);\r
-            Assert.AreEqual(site, page.Website);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            MediaWiki site;\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"\r
-                    + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))\r
-            {\r
-                site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;\r
-            }\r
-\r
-            Assert.IsNotNull(site);\r
-            Assert.AreEqual("http://ja.wikipedia.org", site.Location);\r
-            Assert.AreEqual("ja", site.Language.Code);\r
-            // TODO: プロパティに値が設定されたパターンを追加すべき\r
-            // TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            Language lang = new Language("ja");\r
-            MediaWiki site = new MediaWiki(lang);\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);\r
-            }\r
-\r
-            // プロパティはデフォルト値の場合出力しないという動作あり\r
-            Assert.AreEqual("<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language><NamespacePath /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace /><MagicWords /></MediaWiki>", b.ToString());\r
-            // TODO: プロパティに値が設定されたパターンを追加すべき\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      MediaWikiのテストクラスソース。</summary>
+//
+// <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Reflection;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// MediaWikiのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class MediaWikiTest
+    {
+        #region 定数
+
+        /// <summary>
+        /// テストデータが格納されているフォルダパス。
+        /// </summary>
+        private static readonly string testDir = "Data\\MediaWiki";
+
+        #endregion
+
+        #region テスト支援メソッド
+
+        /// <summary>
+        /// テスト用の値を設定したMediaWikiオブジェクトを返す。
+        /// </summary>
+        public MediaWiki GetTestServer(string language)
+        {
+            // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。
+            //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが
+            //    あるため、それについては随時期待値を調整して対処。
+            UriBuilder b = new UriBuilder("file", "");
+            b.Path = Path.GetFullPath(testDir) + "\\";
+            MediaWiki server = new MediaWiki(new Language(language), new Uri(b.Uri, language + "/").ToString());
+            server.ExportPath = "{0}.xml";
+            server.NamespacePath = "_api.xml";
+            return server;
+        }
+
+        #endregion
+
+        #region コンストラクタテストケース
+
+        /// <summary>
+        /// コンストラクタ(MediaWiki全般)テストケース。
+        /// </summary>
+        [Test]
+        public void TestConstructorLanguageLocation()
+        {
+            MediaWiki site = new MediaWiki(new Language("en"), "test");
+            Assert.AreEqual("en", site.Language.Code);
+            Assert.AreEqual("test", site.Location);
+        }
+
+        /// <summary>
+        /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestConstructorLanguageLocationByLanguageNull()
+        {
+            MediaWiki site = new MediaWiki(null, "test");
+        }
+
+        /// <summary>
+        /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestConstructorLanguageLocationByLocationNull()
+        {
+            MediaWiki site = new MediaWiki(new Language("en"), null);
+        }
+
+        /// <summary>
+        /// コンストラクタ(Wikipedia用)テストケース。
+        /// </summary>
+        [Test]
+        public void TestConstructorLanguage()
+        {
+            MediaWiki site = new MediaWiki(new Language("en"));
+            Assert.AreEqual("en", site.Language.Code);
+            Assert.AreEqual("http://en.wikipedia.org", site.Location);
+        }
+
+        /// <summary>
+        /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestConstructorLanguageByLanguageNull()
+        {
+            MediaWiki site = new MediaWiki(null);
+        }
+
+        #endregion
+
+        #region 設定ファイルに初期値を持つプロパティテストケース
+
+        /// <summary>
+        /// NamespacePathプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestNamespacePath()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
+            // 値を設定するとその値が返る
+            site.NamespacePath = "test";
+            Assert.AreEqual("test", site.NamespacePath);
+            // 空またはnullの場合、再び設定ファイルの値が入る
+            site.NamespacePath = null;
+            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
+            site.NamespacePath = String.Empty;
+            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases", site.NamespacePath);
+        }
+
+        /// <summary>
+        /// ExportPathプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestExportPath()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
+            // 値を設定するとその値が返る
+            site.ExportPath = "test";
+            Assert.AreEqual("test", site.ExportPath);
+            // 空またはnullの場合、再び設定ファイルの値が入る
+            site.ExportPath = null;
+            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
+            site.ExportPath = String.Empty;
+            Assert.AreEqual("/wiki/Special:Export/{0}", site.ExportPath);
+        }
+
+        /// <summary>
+        /// Redirectプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestRedirect()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual("#REDIRECT", site.Redirect);
+            // 値を設定するとその値が返る
+            site.Redirect = "test";
+            Assert.AreEqual("test", site.Redirect);
+            // 空またはnullの場合、再び設定ファイルの値が入る
+            site.Redirect = null;
+            Assert.AreEqual("#REDIRECT", site.Redirect);
+            site.Redirect = String.Empty;
+            Assert.AreEqual("#REDIRECT", site.Redirect);
+        }
+
+        /// <summary>
+        /// TemplateNamespaceプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestTemplateNamespace()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual(10, site.TemplateNamespace);
+            // 値を設定するとその値が返る
+            site.TemplateNamespace = -1;
+            Assert.AreEqual(-1, site.TemplateNamespace);
+        }
+
+        /// <summary>
+        /// CategoryNamespaceプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestCategoryNamespace()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual(14, site.CategoryNamespace);
+            // 値を設定するとその値が返る
+            site.CategoryNamespace = -1;
+            Assert.AreEqual(-1, site.CategoryNamespace);
+        }
+
+        /// <summary>
+        /// FileNamespaceプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestFileNamespace()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.AreEqual(6, site.FileNamespace);
+            // 値を設定するとその値が返る
+            site.FileNamespace = -1;
+            Assert.AreEqual(-1, site.FileNamespace);
+        }
+
+        /// <summary>
+        /// MagicWordsプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestMagicWords()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは設定ファイルの値が返される
+            Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
+            // 値を設定するとその値が返る
+            site.MagicWords = new string[0];
+            Assert.AreEqual(0, site.MagicWords.Count);
+            // nullの場合、再び設定ファイルの値が入る
+            site.MagicWords = null;
+            Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
+        }
+
+        #endregion
+
+        #region それ以外のプロパティテストケース
+
+        /// <summary>
+        /// Namespacesプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestNamespaces()
+        {
+            MediaWiki site = this.GetTestServer("en");
+            // デフォルトではサーバーからダウンロードした値が返される
+            IList<string> names = site.Namespaces[6];
+            Assert.AreEqual("File", names[0]);
+            Assert.AreEqual("File", names[1]);
+            Assert.AreEqual("Image", names[2]);
+            // 値を設定するとその値が返る
+            IDictionary<int, IList<string>> dic = new Dictionary<int, IList<string>>();
+            dic.Add(1, new string[]{"test"});
+            site.Namespaces = dic;
+            Assert.AreEqual(1, site.Namespaces.Count);
+            // 空の場合、再び設定ファイルの値が入る
+            site.Namespaces = new Dictionary<int, IList<string>>();
+            Assert.AreEqual("File", names[0]);
+        }
+
+        /// <summary>
+        /// Namespacesプロパティテストケース(null)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestNamespacesNull()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            site.Namespaces = null;
+        }
+
+        /// <summary>
+        /// DocumentationTemplateプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestDocumentationTemplate()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは空
+            Assert.IsNullOrEmpty(site.DocumentationTemplate);
+            // その値が返る
+            site.DocumentationTemplate = "Template:Documentation";
+            Assert.AreEqual("Template:Documentation", site.DocumentationTemplate);
+        }
+
+        /// <summary>
+        /// DocumentationTemplateDefaultPageプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestDocumentationTemplateDefaultPage()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            // デフォルトでは空
+            Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
+            // その値が返る
+            site.DocumentationTemplateDefaultPage = "/doc";
+            Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
+        }
+
+        #endregion
+
+        #region 公開メソッドテストケース
+
+        /// <summary>
+        /// GetPageプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestGetPage()
+        {
+            MediaWiki site = this.GetTestServer("en");
+            Page page = site.GetPage("example");
+            Assert.IsInstanceOf(typeof(MediaWikiPage), page);
+            Assert.AreEqual("Example", page.Title);
+            Assert.AreEqual(DateTime.Parse("2010/07/13 09:49:18"), page.Timestamp);
+            Assert.IsNotEmpty(page.Text);
+            Assert.AreEqual(site, page.Website);
+        }
+
+        #endregion
+
+        #region XMLシリアライズ用メソッドテストケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            MediaWiki site;
+            using (XmlReader r = XmlReader.Create(
+                new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
+                    + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
+            {
+                site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
+            }
+
+            Assert.IsNotNull(site);
+            Assert.AreEqual("http://ja.wikipedia.org", site.Location);
+            Assert.AreEqual("ja", site.Language.Code);
+            // TODO: プロパティに値が設定されたパターンを追加すべき
+            // TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            Language lang = new Language("ja");
+            MediaWiki site = new MediaWiki(lang);
+            XmlWriterSettings settings = new XmlWriterSettings();
+            settings.OmitXmlDeclaration = true;
+
+            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><NamespacePath /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace /><MagicWords /></MediaWiki>", b.ToString());
+            // TODO: プロパティに値が設定されたパターンを追加すべき
+        }
+
+        #endregion
+    }
+}
index bec7e8b..69b80de 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Pageのテストクラスソース。</summary>\r
-//\r
-// <copyright file="PageTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using NUnit.Framework;\r
-    using Honememo.Tests;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// Pageのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class PageTest\r
-    {\r
-        /// <summary>\r
-        /// Pageテスト用のモッククラスです。\r
-        /// </summary>\r
-        public class DummySite : Website\r
-        {\r
-            #region ダミーメソッド\r
-\r
-            /// <summary>\r
-            /// ページを取得。\r
-            /// </summary>\r
-            /// <param name="title">ページタイトル。</param>\r
-            /// <returns>取得したページ。</returns>\r
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-            public override Page GetPage(string title)\r
-            {\r
-                return null;\r
-            }\r
-\r
-            #endregion\r
-        }\r
-\r
-        #region コンストラクタテストケース\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorWebsiteTitleTextTimestamp()\r
-        {\r
-            DateTime t = DateTime.Now;\r
-            Website s = new DummySite();\r
-            Page page = new Page(s, "TestTitle", "TestText", t);\r
-            Assert.AreEqual(s, page.Website);\r
-            Assert.AreEqual("TestTitle", page.Title);\r
-            Assert.AreEqual("TestText", page.Text);\r
-            Assert.AreEqual(t, page.Timestamp);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(タイムスタンプ無し)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorWebsiteTitleText()\r
-        {\r
-            Website s = new DummySite();\r
-            Page page = new Page(s, "TestTitle", "TestText");\r
-            Assert.AreEqual(s, page.Website);\r
-            Assert.AreEqual("TestTitle", page.Title);\r
-            Assert.AreEqual("TestText", page.Text);\r
-            Assert.IsNull(page.Timestamp);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(本文・タイムスタンプ無し)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestConstructorWebsiteTitle()\r
-        {\r
-            Website s = new DummySite();\r
-            Page page = new Page(s, "TestTitle");\r
-            Assert.AreEqual(s, page.Website);\r
-            Assert.AreEqual("TestTitle", page.Title);\r
-            Assert.IsNull(page.Text);\r
-            Assert.IsNull(page.Timestamp);\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(ウェブサイトがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestConstructorWebsiteNull()\r
-        {\r
-            new Page(null, "TestTitle");\r
-        }\r
-\r
-        /// <summary>\r
-        /// コンストラクタテストケース(タイトルが空)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentException))]\r
-        public void TestConstructorTitleBlank()\r
-        {\r
-            Page page = new Page(new DummySite(), "  ");\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// Websiteプロパティテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWebsite()\r
-        {\r
-            Page page = new Page(new DummySite(), "TestTitle");\r
-            Website s = new DummySite();\r
-            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);\r
-            acc.SetProperty("Website", s);\r
-            Assert.AreEqual(s, page.Website);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Websiteプロパティテストケース(null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestWebsiteNull()\r
-        {\r
-            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))\r
-                .SetProperty("Website", null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Titleプロパティテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTitle()\r
-        {\r
-            Page page = new Page(new DummySite(), "TestTitle");\r
-            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);\r
-            acc.SetProperty("Title", "ChangeTitle");\r
-            Assert.AreEqual("ChangeTitle", page.Title);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Titleプロパティテストケース(null値)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestTitleNull()\r
-        {\r
-            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))\r
-                .SetProperty("Title", null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Titleプロパティテストケース(空)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentException))]\r
-        public void TestTitleBlank()\r
-        {\r
-            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))\r
-                .SetProperty("Title", "  ");\r
-        }\r
-\r
-        /// <summary>\r
-        /// Textプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestText()\r
-        {\r
-            Page page = new Page(new DummySite(), "TestTitle");\r
-            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);\r
-            acc.SetProperty("Text", "TestText");\r
-            Assert.AreEqual("TestText", page.Text);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Timestampプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTimestamp()\r
-        {\r
-            Page page = new Page(new DummySite(), "TestTitle");\r
-            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);\r
-            DateTime t = DateTime.Now;\r
-            acc.SetProperty("Timestamp", t);\r
-            Assert.AreEqual(t, page.Timestamp);\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Pageのテストクラスソース。</summary>
+//
+// <copyright file="PageTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using NUnit.Framework;
+    using Honememo.Tests;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// Pageのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class PageTest
+    {
+        /// <summary>
+        /// Pageテスト用のモッククラスです。
+        /// </summary>
+        public class DummySite : Website
+        {
+            #region ダミーメソッド
+
+            /// <summary>
+            /// ページを取得。
+            /// </summary>
+            /// <param name="title">ページタイトル。</param>
+            /// <returns>取得したページ。</returns>
+            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+            public override Page GetPage(string title)
+            {
+                return null;
+            }
+
+            #endregion
+        }
+
+        #region コンストラクタテストケース
+
+        /// <summary>
+        /// コンストラクタテストケース。
+        /// </summary>
+        [Test]
+        public void TestConstructorWebsiteTitleTextTimestamp()
+        {
+            DateTime t = DateTime.Now;
+            Website s = new DummySite();
+            Page page = new Page(s, "TestTitle", "TestText", t);
+            Assert.AreEqual(s, page.Website);
+            Assert.AreEqual("TestTitle", page.Title);
+            Assert.AreEqual("TestText", page.Text);
+            Assert.AreEqual(t, page.Timestamp);
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(タイムスタンプ無し)。
+        /// </summary>
+        [Test]
+        public void TestConstructorWebsiteTitleText()
+        {
+            Website s = new DummySite();
+            Page page = new Page(s, "TestTitle", "TestText");
+            Assert.AreEqual(s, page.Website);
+            Assert.AreEqual("TestTitle", page.Title);
+            Assert.AreEqual("TestText", page.Text);
+            Assert.IsNull(page.Timestamp);
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(本文・タイムスタンプ無し)。
+        /// </summary>
+        [Test]
+        public void TestConstructorWebsiteTitle()
+        {
+            Website s = new DummySite();
+            Page page = new Page(s, "TestTitle");
+            Assert.AreEqual(s, page.Website);
+            Assert.AreEqual("TestTitle", page.Title);
+            Assert.IsNull(page.Text);
+            Assert.IsNull(page.Timestamp);
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(ウェブサイトがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestConstructorWebsiteNull()
+        {
+            new Page(null, "TestTitle");
+        }
+
+        /// <summary>
+        /// コンストラクタテストケース(タイトルが空)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestConstructorTitleBlank()
+        {
+            Page page = new Page(new DummySite(), "  ");
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// Websiteプロパティテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestWebsite()
+        {
+            Page page = new Page(new DummySite(), "TestTitle");
+            Website s = new DummySite();
+            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);
+            acc.SetProperty("Website", s);
+            Assert.AreEqual(s, page.Website);
+        }
+
+        /// <summary>
+        /// Websiteプロパティテストケース(null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestWebsiteNull()
+        {
+            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))
+                .SetProperty("Website", null);
+        }
+
+        /// <summary>
+        /// Titleプロパティテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestTitle()
+        {
+            Page page = new Page(new DummySite(), "TestTitle");
+            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);
+            acc.SetProperty("Title", "ChangeTitle");
+            Assert.AreEqual("ChangeTitle", page.Title);
+        }
+
+        /// <summary>
+        /// Titleプロパティテストケース(null値)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestTitleNull()
+        {
+            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))
+                .SetProperty("Title", null);
+        }
+
+        /// <summary>
+        /// Titleプロパティテストケース(空)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestTitleBlank()
+        {
+            new PrivateAccessor<Page>(new Page(new DummySite(), "TestTitle"))
+                .SetProperty("Title", "  ");
+        }
+
+        /// <summary>
+        /// Textプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestText()
+        {
+            Page page = new Page(new DummySite(), "TestTitle");
+            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);
+            acc.SetProperty("Text", "TestText");
+            Assert.AreEqual("TestText", page.Text);
+        }
+
+        /// <summary>
+        /// Timestampプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestTimestamp()
+        {
+            Page page = new Page(new DummySite(), "TestTitle");
+            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);
+            DateTime t = DateTime.Now;
+            acc.SetProperty("Timestamp", t);
+            Assert.AreEqual(t, page.Timestamp);
+        }
+
+        #endregion
+    }
+}
index 47e0c20..226b02f 100644 (file)
@@ -1,42 +1,42 @@
-// ================================================================================================\r
-// <summary>\r
-//      テスト用に拡張したConfigクラスソース。</summary>\r
-//\r
-// <copyright file="TestingConfig.cs.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.IO;\r
-using System.Xml.Serialization;\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    /// <summary>\r
-    /// テスト用に拡張したConfigクラスです。\r
-    /// </summary>\r
-    public class TestingConfig : Config\r
-    {        \r
-        #region テスト支援メソッド\r
-\r
-        /// <summary>\r
-        /// アプリケーションの設定を取得する。\r
-        /// </summary>\r
-        /// <param name="file">設定ファイル名。</param>\r
-        /// <returns>作成したインスタンス。</returns>\r
-        /// <remarks>テスト用のため、特に親クラスのようなシングルトンといった制御はせず。</remarks>\r
-        public static new Config GetInstance(string file)\r
-        {\r
-            // 設定ファイルを読み込み\r
-            using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read))\r
-            {\r
-                return new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      テスト用に拡張したConfigクラスソース。</summary>
+//
+// <copyright file="TestingConfig.cs.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.Serialization;
+
+namespace Honememo.Wptscs.Models
+{
+    /// <summary>
+    /// テスト用に拡張したConfigクラスです。
+    /// </summary>
+    public class TestingConfig : Config
+    {        
+        #region テスト支援メソッド
+
+        /// <summary>
+        /// アプリケーションの設定を取得する。
+        /// </summary>
+        /// <param name="file">設定ファイル名。</param>
+        /// <returns>作成したインスタンス。</returns>
+        /// <remarks>テスト用のため、特に親クラスのようなシングルトンといった制御はせず。</remarks>
+        public static new Config GetInstance(string file)
+        {
+            // 設定ファイルを読み込み
+            using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read))
+            {
+                return new XmlSerializer(typeof(Config)).Deserialize(stream) as Config;
+            }
+        }
+
+        #endregion
+    }
+}
index 29a0dd6..d189fbd 100644 (file)
@@ -1,85 +1,85 @@
-// ================================================================================================\r
-// <summary>\r
-//      TranslationDictionaryのテストクラスソース。</summary>\r
-//\r
-// <copyright file="TranslationDictionaryTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// TranslationDictionaryのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class TranslationDictionaryTest\r
-    {\r
-\r
-\r
-        #region XMLシリアライズ用メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            //TODO: リダイレクトとタイムスタンプも\r
-            TranslationDictionary dic;\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader("<TranslationDictionary From=\"en\" To=\"ja\"><Item From=\".example\" To=\"。さんぷる\" />"\r
-                    + "<Item From=\"Template:Disambig\" To=\"Template:曖昧さ回避\" /></TranslationDictionary>")))\r
-            {\r
-                dic = new XmlSerializer(typeof(TranslationDictionary)).Deserialize(r) as TranslationDictionary;\r
-            }\r
-            Assert.AreEqual(2, dic.Count);\r
-            Assert.AreEqual("。さんぷる", dic[".example"].Word);\r
-            Assert.AreEqual("Template:曖昧さ回避", dic["Template:Disambig"].Word);\r
-            Assert.IsFalse(dic.ContainsKey("。さんぷる"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            //TODO: リダイレクトとタイムスタンプも\r
-            TranslationDictionary dic = new TranslationDictionary("en", "ja");\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(TranslationDictionary)).Serialize(w, dic);\r
-            }\r
-\r
-            Assert.AreEqual("<TranslationDictionary From=\"en\" To=\"ja\" />", b.ToString());\r
-\r
-            dic[".example"] = new TranslationDictionary.Item { Word = "。さんぷる" };\r
-            dic["Template:Disambig"] = new TranslationDictionary.Item { Word = "Template:曖昧さ回避" };\r
-\r
-            StringBuilder b2 = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b2, settings))\r
-            {\r
-                new XmlSerializer(typeof(TranslationDictionary)).Serialize(w, dic);\r
-            }\r
-\r
-            Assert.AreEqual("<TranslationDictionary From=\"en\" To=\"ja\"><Item From=\".example\" To=\"。さんぷる\" />"\r
-                    + "<Item From=\"Template:Disambig\" To=\"Template:曖昧さ回避\" /></TranslationDictionary>", b2.ToString());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      TranslationDictionaryのテストクラスソース。</summary>
+//
+// <copyright file="TranslationDictionaryTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// TranslationDictionaryのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class TranslationDictionaryTest
+    {
+
+
+        #region XMLシリアライズ用メソッドテストケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            //TODO: リダイレクトとタイムスタンプも
+            TranslationDictionary dic;
+            using (XmlReader r = XmlReader.Create(
+                new StringReader("<TranslationDictionary From=\"en\" To=\"ja\"><Item From=\".example\" To=\"。さんぷる\" />"
+                    + "<Item From=\"Template:Disambig\" To=\"Template:曖昧さ回避\" /></TranslationDictionary>")))
+            {
+                dic = new XmlSerializer(typeof(TranslationDictionary)).Deserialize(r) as TranslationDictionary;
+            }
+            Assert.AreEqual(2, dic.Count);
+            Assert.AreEqual("。さんぷる", dic[".example"].Word);
+            Assert.AreEqual("Template:曖昧さ回避", dic["Template:Disambig"].Word);
+            Assert.IsFalse(dic.ContainsKey("。さんぷる"));
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            //TODO: リダイレクトとタイムスタンプも
+            TranslationDictionary dic = new TranslationDictionary("en", "ja");
+            XmlWriterSettings settings = new XmlWriterSettings();
+            settings.OmitXmlDeclaration = true;
+
+            StringBuilder b = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b, settings))
+            {
+                new XmlSerializer(typeof(TranslationDictionary)).Serialize(w, dic);
+            }
+
+            Assert.AreEqual("<TranslationDictionary From=\"en\" To=\"ja\" />", b.ToString());
+
+            dic[".example"] = new TranslationDictionary.Item { Word = "。さんぷる" };
+            dic["Template:Disambig"] = new TranslationDictionary.Item { Word = "Template:曖昧さ回避" };
+
+            StringBuilder b2 = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b2, settings))
+            {
+                new XmlSerializer(typeof(TranslationDictionary)).Serialize(w, dic);
+            }
+
+            Assert.AreEqual("<TranslationDictionary From=\"en\" To=\"ja\"><Item From=\".example\" To=\"。さんぷる\" />"
+                    + "<Item From=\"Template:Disambig\" To=\"Template:曖昧さ回避\" /></TranslationDictionary>", b2.ToString());
+        }
+
+        #endregion
+    }
+}
index daa2985..b7bf667 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      TranslationTableのテストクラスソース。</summary>\r
-//\r
-// <copyright file="TranslationTableTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.IO;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// TranslationTableのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class TranslationTableTest\r
-    {\r
-        #region 公開メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// GetWordメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestGetWord()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            IDictionary<string, string> record = new Dictionary<string, string>();\r
-            record["en"] = "See also";\r
-            record["ja"] = "関連項目";\r
-            table.Add(record);\r
-            table.From = "en";\r
-            table.To = "ja";\r
-            Assert.AreEqual("関連項目", table.GetWord("See also"));\r
-            Assert.AreEqual("関連項目", table.GetWord("see also"));\r
-            Assert.IsNull(table.GetWord("test"));\r
-            Assert.IsNull(table.GetWord(String.Empty));\r
-            Assert.AreEqual("See also", table.GetWord("ja", "en", "関連項目"));\r
-            Assert.IsNull(table.GetWord("ja", "en", String.Empty));\r
-            Assert.IsNull(table.GetWord("ja", String.Empty, String.Empty));\r
-            Assert.IsNull(table.GetWord(String.Empty, String.Empty, String.Empty));\r
-        }\r
-\r
-        /// <summary>\r
-        /// GetWordメソッドテストケース(fromがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestGetWordFromNull()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            table.GetWord(null, "en", "関連項目");\r
-        }\r
-\r
-        /// <summary>\r
-        /// GetWordメソッドテストケース(toがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestGetWordToNull()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            table.GetWord("ja", null, "関連項目");\r
-        }\r
-\r
-        /// <summary>\r
-        /// GetWordメソッドテストケース(wordがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestGetWordWordNull()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            table.GetWord("ja", "en", null);\r
-        }\r
-\r
-        /// <summary>\r
-        /// GetWordメソッドテストケース(プロパティがnull)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(InvalidOperationException))]\r
-        public void TestGetWordPropertyNull()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            table.GetWord("関連項目");\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region XMLシリアライズ用メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            TranslationTable table;\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader("<TranslationTable><Group><Word Lang=\"en\">See Also</Word><Word Lang=\"ja\">関連項目</Word></Group>"\r
-                    + "<Group><Word Lang=\"en\">History</Word><Word Lang=\"fr\">Histoire</Word></Group></TranslationTable>")))\r
-            {\r
-                table = new XmlSerializer(typeof(TranslationTable)).Deserialize(r) as TranslationTable;\r
-            }\r
-            Assert.AreEqual(2, table.Count);\r
-            Assert.AreEqual("See Also", table[0]["en"]);\r
-            Assert.AreEqual("関連項目", table[0]["ja"]);\r
-            Assert.IsFalse(table[0].ContainsKey("fr"));\r
-            Assert.AreEqual("History", table[1]["en"]);\r
-            Assert.AreEqual("Histoire", table[1]["fr"]);\r
-            Assert.IsFalse(table[1].ContainsKey("ja"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            TranslationTable table = new TranslationTable();\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(TranslationTable)).Serialize(w, table);\r
-            }\r
-\r
-            Assert.AreEqual("<TranslationTable />", b.ToString());\r
-\r
-            IDictionary<string, string> record = new SortedDictionary<string, string>();\r
-            record["en"] = "See Also";\r
-            record["ja"] = "関連項目";\r
-            table.Add(record);\r
-            record = new SortedDictionary<string, string>();\r
-            record["en"] = "History";\r
-            record["fr"] = "Histoire";\r
-            table.Add(record);\r
-\r
-            StringBuilder b2 = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b2, settings))\r
-            {\r
-                new XmlSerializer(typeof(TranslationTable)).Serialize(w, table);\r
-            }\r
-\r
-            Assert.AreEqual("<TranslationTable><Group><Word Lang=\"en\">See Also</Word><Word Lang=\"ja\">関連項目</Word></Group>"\r
-                    + "<Group><Word Lang=\"en\">History</Word><Word Lang=\"fr\">Histoire</Word></Group></TranslationTable>", b2.ToString());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      TranslationTableのテストクラスソース。</summary>
+//
+// <copyright file="TranslationTableTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.Collections.Generic;
+    using System.IO;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// TranslationTableのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class TranslationTableTest
+    {
+        #region 公開メソッドテストケース
+
+        /// <summary>
+        /// GetWordメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestGetWord()
+        {
+            TranslationTable table = new TranslationTable();
+            IDictionary<string, string> record = new Dictionary<string, string>();
+            record["en"] = "See also";
+            record["ja"] = "関連項目";
+            table.Add(record);
+            table.From = "en";
+            table.To = "ja";
+            Assert.AreEqual("関連項目", table.GetWord("See also"));
+            Assert.AreEqual("関連項目", table.GetWord("see also"));
+            Assert.IsNull(table.GetWord("test"));
+            Assert.IsNull(table.GetWord(String.Empty));
+            Assert.AreEqual("See also", table.GetWord("ja", "en", "関連項目"));
+            Assert.IsNull(table.GetWord("ja", "en", String.Empty));
+            Assert.IsNull(table.GetWord("ja", String.Empty, String.Empty));
+            Assert.IsNull(table.GetWord(String.Empty, String.Empty, String.Empty));
+        }
+
+        /// <summary>
+        /// GetWordメソッドテストケース(fromがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestGetWordFromNull()
+        {
+            TranslationTable table = new TranslationTable();
+            table.GetWord(null, "en", "関連項目");
+        }
+
+        /// <summary>
+        /// GetWordメソッドテストケース(toがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestGetWordToNull()
+        {
+            TranslationTable table = new TranslationTable();
+            table.GetWord("ja", null, "関連項目");
+        }
+
+        /// <summary>
+        /// GetWordメソッドテストケース(wordがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestGetWordWordNull()
+        {
+            TranslationTable table = new TranslationTable();
+            table.GetWord("ja", "en", null);
+        }
+
+        /// <summary>
+        /// GetWordメソッドテストケース(プロパティがnull)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(InvalidOperationException))]
+        public void TestGetWordPropertyNull()
+        {
+            TranslationTable table = new TranslationTable();
+            table.GetWord("関連項目");
+        }
+
+        #endregion
+
+        #region XMLシリアライズ用メソッドテストケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            TranslationTable table;
+            using (XmlReader r = XmlReader.Create(
+                new StringReader("<TranslationTable><Group><Word Lang=\"en\">See Also</Word><Word Lang=\"ja\">関連項目</Word></Group>"
+                    + "<Group><Word Lang=\"en\">History</Word><Word Lang=\"fr\">Histoire</Word></Group></TranslationTable>")))
+            {
+                table = new XmlSerializer(typeof(TranslationTable)).Deserialize(r) as TranslationTable;
+            }
+            Assert.AreEqual(2, table.Count);
+            Assert.AreEqual("See Also", table[0]["en"]);
+            Assert.AreEqual("関連項目", table[0]["ja"]);
+            Assert.IsFalse(table[0].ContainsKey("fr"));
+            Assert.AreEqual("History", table[1]["en"]);
+            Assert.AreEqual("Histoire", table[1]["fr"]);
+            Assert.IsFalse(table[1].ContainsKey("ja"));
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            TranslationTable table = new TranslationTable();
+            XmlWriterSettings settings = new XmlWriterSettings();
+            settings.OmitXmlDeclaration = true;
+
+            StringBuilder b = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b, settings))
+            {
+                new XmlSerializer(typeof(TranslationTable)).Serialize(w, table);
+            }
+
+            Assert.AreEqual("<TranslationTable />", b.ToString());
+
+            IDictionary<string, string> record = new SortedDictionary<string, string>();
+            record["en"] = "See Also";
+            record["ja"] = "関連項目";
+            table.Add(record);
+            record = new SortedDictionary<string, string>();
+            record["en"] = "History";
+            record["fr"] = "Histoire";
+            table.Add(record);
+
+            StringBuilder b2 = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b2, settings))
+            {
+                new XmlSerializer(typeof(TranslationTable)).Serialize(w, table);
+            }
+
+            Assert.AreEqual("<TranslationTable><Group><Word Lang=\"en\">See Also</Word><Word Lang=\"ja\">関連項目</Word></Group>"
+                    + "<Group><Word Lang=\"en\">History</Word><Word Lang=\"fr\">Histoire</Word></Group></TranslationTable>", b2.ToString());
+        }
+
+        #endregion
+    }
+}
index c95880b..62a1fcf 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Websiteのテストクラスソース。</summary>\r
-//\r
-// <copyright file="WebsiteTest.cs.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Wptscs.Models\r
-{\r
-    using System;\r
-    using System.IO;\r
-    using System.Reflection;\r
-    using System.Text;\r
-    using System.Xml;\r
-    using System.Xml.Serialization;\r
-    using NUnit.Framework;\r
-    using Honememo.Utilities;\r
-\r
-    /// <summary>\r
-    /// Websiteのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class WebsiteTest\r
-    {\r
-        #region モッククラス\r
-\r
-        /// <summary>\r
-        /// Websiteテスト用のモッククラスです。\r
-        /// </summary>\r
-        public class DummySite : Website, IXmlSerializable\r
-        {\r
-            #region テスト用プロパティ\r
-\r
-            /// <summary>\r
-            /// ウェブサイトの場所。\r
-            /// </summary>\r
-            /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>\r
-            public new string Location\r
-            {\r
-                get\r
-                {\r
-                    return base.Location;\r
-                }\r
-\r
-                set\r
-                {\r
-                    base.Location = value;\r
-                }\r
-            }\r
-\r
-            /// <summary>\r
-            /// ウェブサイトの言語。\r
-            /// </summary>\r
-            public new Language Language\r
-            {\r
-                get\r
-                {\r
-                    return base.Language;\r
-                }\r
-\r
-                set\r
-                {\r
-                    base.Language = value;\r
-                }\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region ダミーメソッド\r
-\r
-            /// <summary>\r
-            /// ページを取得。\r
-            /// </summary>\r
-            /// <param name="title">ページタイトル。</param>\r
-            /// <returns>取得したページ。</returns>\r
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>\r
-            public override Page GetPage(string title)\r
-            {\r
-                return null;\r
-            }\r
-\r
-            #endregion\r
-\r
-            #region テスト用XMLシリアライズ用メソッド\r
-\r
-            /// <summary>\r
-            /// シリアライズするXMLのスキーマ定義を返す。\r
-            /// </summary>\r
-            /// <returns>XML表現を記述するXmlSchema。</returns>\r
-            public System.Xml.Schema.XmlSchema GetSchema()\r
-            {\r
-                return null;\r
-            }\r
-\r
-            /// <summary>\r
-            /// XMLからオブジェクトをデシリアライズする。\r
-            /// </summary>\r
-            /// <param name="reader">デシリアライズ元のXmlReader</param>\r
-            public void ReadXml(XmlReader reader)\r
-            {\r
-                XmlDocument xml = new XmlDocument();\r
-                xml.Load(reader);\r
-\r
-                // Webサイト\r
-                // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす\r
-                XmlElement siteElement = xml.SelectSingleNode("DummySite") as XmlElement;\r
-                this.Location = siteElement.SelectSingleNode("Location").InnerText;\r
-\r
-                using (XmlReader r = XmlReader.Create(\r
-                    new StringReader(siteElement.SelectSingleNode("Language").OuterXml), reader.Settings))\r
-                {\r
-                    this.Language = new XmlSerializer(typeof(Language)).Deserialize(r) as Language;\r
-                }\r
-            }\r
-\r
-            /// <summary>\r
-            /// オブジェクトをXMLにシリアライズする。\r
-            /// </summary>\r
-            /// <param name="writer">シリアライズ先のXmlWriter</param>\r
-            public void WriteXml(XmlWriter writer)\r
-            {\r
-                writer.WriteElementString("Location", this.Location);\r
-                new XmlSerializer(typeof(Language)).Serialize(writer, this.Language);\r
-            }\r
-\r
-            #endregion\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティテストケース\r
-\r
-        /// <summary>\r
-        /// Locationプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestLocation()\r
-        {\r
-            DummySite site = new DummySite();\r
-            site.Location = "test";\r
-            Assert.AreEqual("test", site.Location);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Locationプロパティテストケース(null)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestLocationNull()\r
-        {\r
-            new DummySite().Location = null;\r
-        }\r
-\r
-        /// <summary>\r
-        /// Locationプロパティテストケース(空)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentException))]\r
-        public void TestLocationBlank()\r
-        {\r
-            new DummySite().Location = " ";\r
-        }\r
-\r
-        /// <summary>\r
-        /// Languageプロパティテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestLanguage()\r
-        {\r
-            DummySite site = new DummySite();\r
-            site.Language = new Language("ja");\r
-            Assert.AreEqual("ja", site.Language.Code);\r
-        }\r
-\r
-        /// <summary>\r
-        /// Languageプロパティテストケース(null)。\r
-        /// </summary>\r
-        [Test]\r
-        [ExpectedException(typeof(ArgumentNullException))]\r
-        public void TestLanguageNull()\r
-        {\r
-            new DummySite().Language = null;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// XMLデシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReadXml()\r
-        {\r
-            DummySite site;\r
-            using (XmlReader r = XmlReader.Create(\r
-                new StringReader("<DummySite><Location>http://ja.wikipedia.org</Location>"\r
-                    + "<Language Code=\"ja\"><Names /></Language></DummySite>")))\r
-            {\r
-                site = new XmlSerializer(typeof(DummySite)).Deserialize(r) as DummySite;\r
-            }\r
-\r
-            Assert.IsNotNull(site);\r
-            Assert.AreEqual("http://ja.wikipedia.org", site.Location);\r
-            Assert.AreEqual("ja", site.Language.Code);\r
-        }\r
-\r
-        /// <summary>\r
-        /// XMLシリアライズテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestWriteXml()\r
-        {\r
-            Language lang = new Language("ja");\r
-            DummySite site = new DummySite();\r
-            site.Location = "http://ja.wikipedia.org";\r
-            site.Language = lang;\r
-            XmlWriterSettings settings = new XmlWriterSettings();\r
-            settings.OmitXmlDeclaration = true;\r
-\r
-            StringBuilder b = new StringBuilder();\r
-            using (XmlWriter w = XmlWriter.Create(b, settings))\r
-            {\r
-                new XmlSerializer(typeof(DummySite)).Serialize(w, site);\r
-            }\r
-\r
-            Assert.AreEqual("<DummySite><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language></DummySite>", b.ToString());\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Websiteのテストクラスソース。</summary>
+//
+// <copyright file="WebsiteTest.cs.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Wptscs.Models
+{
+    using System;
+    using System.IO;
+    using System.Reflection;
+    using System.Text;
+    using System.Xml;
+    using System.Xml.Serialization;
+    using NUnit.Framework;
+    using Honememo.Utilities;
+
+    /// <summary>
+    /// Websiteのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class WebsiteTest
+    {
+        #region モッククラス
+
+        /// <summary>
+        /// Websiteテスト用のモッククラスです。
+        /// </summary>
+        public class DummySite : Website, IXmlSerializable
+        {
+            #region テスト用プロパティ
+
+            /// <summary>
+            /// ウェブサイトの場所。
+            /// </summary>
+            /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>
+            public new string Location
+            {
+                get
+                {
+                    return base.Location;
+                }
+
+                set
+                {
+                    base.Location = value;
+                }
+            }
+
+            /// <summary>
+            /// ウェブサイトの言語。
+            /// </summary>
+            public new Language Language
+            {
+                get
+                {
+                    return base.Language;
+                }
+
+                set
+                {
+                    base.Language = value;
+                }
+            }
+
+            #endregion
+
+            #region ダミーメソッド
+
+            /// <summary>
+            /// ページを取得。
+            /// </summary>
+            /// <param name="title">ページタイトル。</param>
+            /// <returns>取得したページ。</returns>
+            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+            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
+
+        #region プロパティテストケース
+
+        /// <summary>
+        /// Locationプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestLocation()
+        {
+            DummySite site = new DummySite();
+            site.Location = "test";
+            Assert.AreEqual("test", site.Location);
+        }
+
+        /// <summary>
+        /// Locationプロパティテストケース(null)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestLocationNull()
+        {
+            new DummySite().Location = null;
+        }
+
+        /// <summary>
+        /// Locationプロパティテストケース(空)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestLocationBlank()
+        {
+            new DummySite().Location = " ";
+        }
+
+        /// <summary>
+        /// Languageプロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestLanguage()
+        {
+            DummySite site = new DummySite();
+            site.Language = new Language("ja");
+            Assert.AreEqual("ja", site.Language.Code);
+        }
+
+        /// <summary>
+        /// Languageプロパティテストケース(null)。
+        /// </summary>
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestLanguageNull()
+        {
+            new DummySite().Language = null;
+        }
+
+        #endregion
+
+        #region メソッドテストケース
+
+        /// <summary>
+        /// XMLデシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestReadXml()
+        {
+            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;
+            }
+
+            Assert.IsNotNull(site);
+            Assert.AreEqual("http://ja.wikipedia.org", site.Location);
+            Assert.AreEqual("ja", site.Language.Code);
+        }
+
+        /// <summary>
+        /// XMLシリアライズテストケース。
+        /// </summary>
+        [Test]
+        public void TestWriteXml()
+        {
+            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());
+        }
+
+        #endregion
+    }
+}
index a10656b..8c11f7f 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      NUnitテスト支援用クラスソース。</summary>\r
-//\r
-// <copyright file="PrivateAccessor.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Tests\r
-{\r
-    using System;\r
-    using System.Collections.Generic;\r
-    using System.Reflection;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// NUnitでのテスト用に private, protected といった外部からアクセスできないメソッドを実行するためのクラス。\r
-    /// クラス・オブジェクトに被せるように使用する。\r
-    /// </summary>\r
-    /// <typeparam name="T">ラップするオブジェクトのクラス。</typeparam>\r
-    /// <remarks>使い方については、概ねJUnitのPrivateAccessorと同じようなイメージ。</remarks>\r
-    public class PrivateAccessor<T>\r
-    {\r
-        #region private変数\r
-\r
-        /// <summary>\r
-        /// オブジェクトを生成する際に使用するコンストラクタ。\r
-        /// </summary>\r
-        private ConstructorInfo constructor;\r
-\r
-        /// <summary>\r
-        /// テストするメソッド。\r
-        /// </summary>\r
-        private MethodInfo method;\r
-\r
-        #endregion\r
-\r
-        #region コンストラクタ\r
-\r
-        /// <summary>\r
-        /// 指定されたオブジェクトをテストするためのインスタンスを生成。\r
-        /// </summary>\r
-        /// <param name="obj">オブジェクト。</param>\r
-        public PrivateAccessor(T obj)\r
-        {\r
-            this.Instance = obj;\r
-        }\r
-\r
-        /// <summary>\r
-        /// 新しいオブジェクトをテストするためのインスタンスを生成。\r
-        /// </summary>\r
-        public PrivateAccessor()\r
-        {\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region プロパティ\r
-\r
-        /// <summary>\r
-        /// テストする/したクラスのオブジェクト。\r
-        /// </summary>\r
-        public T Instance\r
-        {\r
-            get;\r
-            set;\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region メソッド\r
-\r
-        /// <summary>\r
-        /// テストするクラスのコンストラクタを指定する。\r
-        /// </summary>\r
-        /// <param name="parameterTypes">パラメータ配列。</param>\r
-        /// <remarks>コンストラクタの確保に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>\r
-        public void SetConstructor(params Type[] parameterTypes)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたコンストラクタを取得\r
-                this.constructor = typeof(T).GetConstructor(\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,\r
-                    null,\r
-                    parameterTypes,\r
-                    null);\r
-                if (this.constructor == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail("Constructor is not found");\r
-                }\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // メソッド指定誤り、アクセス不可も含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストするクラスのオブジェクトを指定されたパラメータで生成する。\r
-        /// </summary>\r
-        /// <param name="initargs">コンストラクタ呼び出しに引数として渡すオブジェクトの配列。</param>\r
-        /// <returns>このオブジェクトが表すコンストラクタを呼び出すことで作成される新規オブジェクト。</returns>\r
-        /// <remarks>\r
-        /// コンストラクタには、<c>SetConstructor()</c> で指定されたメソッドを用いる。\r
-        /// 指定されていない場合は、デフォルトコンストラクタを使用する。\r
-        /// オブジェクトの生成に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。\r
-        /// </remarks>\r
-        public T NewInstance(params object[] initargs)\r
-        {\r
-            try\r
-            {\r
-                // コンストラクタが指定されておらず、パラメータも0件の場合\r
-                if (this.constructor == null\r
-                        && (initargs == null || initargs.Length == 0))\r
-                {\r
-                    // デフォルトコンストラクタを使用する\r
-                    this.SetConstructor();\r
-                }\r
-\r
-                // 指定されているコンストラクタでオブジェクトを生成\r
-                this.Instance = (T)this.constructor.Invoke(initargs);\r
-\r
-                // 生成したオブジェクトを返す\r
-                return this.Instance;\r
-            }\r
-            catch (TargetInvocationException e)\r
-            {\r
-                // コンストラクタが例外を投げる場合は、そのまま返す\r
-                throw e.InnerException;\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // オブジェクトが生成できない場合、テスト失敗\r
-                Assert.Fail(e.Message);\r
-\r
-                // failの時点で処理は終了する、コンパイルエラー抑止\r
-                throw new Exception("Accessor error", e);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストするメソッドを指定する。\r
-        /// </summary>\r
-        /// <param name="name">メソッドの名前。</param>\r
-        /// <param name="parameterTypes">パラメータ配列。</param>\r
-        /// <remarks>メソッドの確保に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>\r
-        public void SetMethod(string name, params Type[] parameterTypes)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたメソッドを取得\r
-                this.method = typeof(T).GetMethod(\r
-                    name,\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,\r
-                    null,\r
-                    parameterTypes,\r
-                    null);\r
-                if (this.method == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail(name + " is not found");\r
-                }\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // メソッド指定誤り、アクセス不可も含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// 指定されているメソッドを実行する。\r
-        /// </summary>\r
-        /// <param name="args">メソッド呼び出しに使用される引数。</param>\r
-        /// <returns>このオブジェクトが表すメソッドを、パラメータ<para>args</para>を使用して実行した結果。</returns>\r
-        /// <remarks>\r
-        /// staticメソッド以外の場合必要な呼び出し元オブジェクトには、\r
-        /// <c>NewInstance()</c> または <c> SetInstance()</c>\r
-        /// で指定されたオブジェクトを用いる。\r
-        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。\r
-        /// メソッドの実行に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。\r
-        /// </remarks>\r
-        public object Invoke(params object[] args)\r
-        {\r
-            try\r
-            {\r
-                // オブジェクトが指定されておらず、非staticメソッドの場合\r
-                if (this.Instance == null && !this.method.IsStatic)\r
-                {\r
-                    // デフォルトコンストラクタでオブジェクトを作成する\r
-                    // ※ コンストラクタが指定されている場合、例外\r
-                    this.NewInstance();\r
-                }\r
-\r
-                // 指定されているオブジェクトでメソッドを実行\r
-                return this.method.Invoke(this.Instance, args);\r
-            }\r
-            catch (TargetInvocationException e)\r
-            {\r
-                // メソッドが例外を投げる場合は、そのまま返す\r
-                throw e.InnerException;\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // メソッド未設定、型違いも含めて全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-\r
-                // failの時点で処理は終了する、コンパイルエラー抑止\r
-                throw new Exception("Accessor error", e);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストする/したクラスのオブジェクトより、指定されたフィールドの値を返す。\r
-        /// </summary>\r
-        /// <param name="name">フィールド名。</param>\r
-        /// <returns>フィールドの値。</returns>\r
-        /// <remarks>値の取得に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>\r
-        public object GetField(string name)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたフィールドを取得\r
-                FieldInfo field = typeof(T).GetField(\r
-                    name,\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);\r
-                if (field == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail(name + " is not found");\r
-                }\r
-\r
-                // 指定された値をフィールドから取得する\r
-                return field.GetValue(this.Instance);\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // フィールド指定誤り、アクセス不可、オブジェクト無しも含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-\r
-                // failの時点で処理は終了する、コンパイルエラー抑止\r
-                throw new Exception("Accessor error", e);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストするクラスのオブジェクトで、指定されたフィールドに値を設定する。\r
-        /// </summary>\r
-        /// <param name="name">フィールド名。</param>\r
-        /// <param name="value">新しいフィールド値。</param>\r
-        /// <remarks>\r
-        /// staticフィールド以外の場合に必要な設定先オブジェクトには、\r
-        /// <c>NewInstance()</c> または <c> SetInstance()</c>\r
-        /// で指定されたオブジェクトを用いる。\r
-        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。\r
-        /// 値の設定に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。\r
-        /// </remarks>\r
-        public void SetField(string name, object value)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたフィールドを取得\r
-                FieldInfo field = typeof(T).GetField(\r
-                    name,\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);\r
-                if (field == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail(name + " is not found");\r
-                }\r
-\r
-                // オブジェクトが指定されておらず、非staticフィールドの場合\r
-                if (this.Instance == null && !field.IsStatic)\r
-                {\r
-                    // デフォルトコンストラクタでオブジェクトを作成する\r
-                    // ※ コンストラクタが指定されている場合、例外\r
-                    this.NewInstance();\r
-                }\r
-\r
-                // 指定された値をフィールドに設定する\r
-                field.SetValue(this.Instance, value);\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // フィールド指定誤り、アクセス不可も含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストする/したクラスのオブジェクトより、指定されたプロパティの値を返す。\r
-        /// </summary>\r
-        /// <param name="name">プロパティ名。</param>\r
-        /// <returns>プロパティの値。</returns>\r
-        /// <remarks>値の取得に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>\r
-        public object GetProperty(string name, params object[] index)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたプロパティを取得\r
-                PropertyInfo property = typeof(T).GetProperty(\r
-                    name,\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r
-                if (property == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail(name + " is not found");\r
-                }\r
-\r
-                // 指定された値をプロパティから取得する\r
-                return property.GetValue(this.Instance, index);\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // プロパティ指定誤り、アクセス不可、オブジェクト無しも含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-\r
-                // failの時点で処理は終了する、コンパイルエラー抑止\r
-                throw new Exception("Accessor error", e);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// テストするクラスのオブジェクトで、指定されたプロパティに値を設定する。\r
-        /// </summary>\r
-        /// <param name="name">プロパティ名。</param>\r
-        /// <param name="value">新しいプロパティ値。</param>\r
-        /// <remarks>\r
-        /// 設定先オブジェクトには <c>NewInstance()</c> または <c> SetInstance()</c>\r
-        /// で指定されたオブジェクトを用いる。\r
-        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。\r
-        /// 値の設定に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。\r
-        /// </remarks>\r
-        public void SetProperty(string name, object value, params object[] index)\r
-        {\r
-            try\r
-            {\r
-                // 指定されたプロパティを取得\r
-                PropertyInfo property = typeof(T).GetProperty(\r
-                    name,\r
-                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);\r
-                if (property == null)\r
-                {\r
-                    // メソッド取得失敗のためテスト失敗\r
-                    Assert.Fail(name + " is not found");\r
-                }\r
-\r
-                // オブジェクトが指定されていない場合\r
-                if (this.Instance == null)\r
-                {\r
-                    // デフォルトコンストラクタでオブジェクトを作成する\r
-                    // ※ コンストラクタが指定されている場合、例外\r
-                    this.NewInstance();\r
-                }\r
-\r
-                // 指定された値をプロパティに設定する\r
-                property.SetValue(this.Instance, value, index);\r
-            }\r
-            catch (TargetInvocationException e)\r
-            {\r
-                // メソッドが例外を投げる場合は、そのまま返す\r
-                throw e.InnerException;\r
-            }\r
-            catch (Exception e)\r
-            {\r
-                // プロパティ指定誤り、アクセス不可も含め全てテスト失敗\r
-                Assert.Fail(e.Message);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      NUnitテスト支援用クラスソース。</summary>
+//
+// <copyright file="PrivateAccessor.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Tests
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Reflection;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// NUnitでのテスト用に private, protected といった外部からアクセスできないメソッドを実行するためのクラス。
+    /// クラス・オブジェクトに被せるように使用する。
+    /// </summary>
+    /// <typeparam name="T">ラップするオブジェクトのクラス。</typeparam>
+    /// <remarks>使い方については、概ねJUnitのPrivateAccessorと同じようなイメージ。</remarks>
+    public class PrivateAccessor<T>
+    {
+        #region private変数
+
+        /// <summary>
+        /// オブジェクトを生成する際に使用するコンストラクタ。
+        /// </summary>
+        private ConstructorInfo constructor;
+
+        /// <summary>
+        /// テストするメソッド。
+        /// </summary>
+        private MethodInfo method;
+
+        #endregion
+
+        #region コンストラクタ
+
+        /// <summary>
+        /// 指定されたオブジェクトをテストするためのインスタンスを生成。
+        /// </summary>
+        /// <param name="obj">オブジェクト。</param>
+        public PrivateAccessor(T obj)
+        {
+            this.Instance = obj;
+        }
+
+        /// <summary>
+        /// 新しいオブジェクトをテストするためのインスタンスを生成。
+        /// </summary>
+        public PrivateAccessor()
+        {
+        }
+
+        #endregion
+
+        #region プロパティ
+
+        /// <summary>
+        /// テストする/したクラスのオブジェクト。
+        /// </summary>
+        public T Instance
+        {
+            get;
+            set;
+        }
+
+        #endregion
+
+        #region メソッド
+
+        /// <summary>
+        /// テストするクラスのコンストラクタを指定する。
+        /// </summary>
+        /// <param name="parameterTypes">パラメータ配列。</param>
+        /// <remarks>コンストラクタの確保に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>
+        public void SetConstructor(params Type[] parameterTypes)
+        {
+            try
+            {
+                // 指定されたコンストラクタを取得
+                this.constructor = typeof(T).GetConstructor(
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
+                    null,
+                    parameterTypes,
+                    null);
+                if (this.constructor == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail("Constructor is not found");
+                }
+            }
+            catch (Exception e)
+            {
+                // メソッド指定誤り、アクセス不可も含め全てテスト失敗
+                Assert.Fail(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// テストするクラスのオブジェクトを指定されたパラメータで生成する。
+        /// </summary>
+        /// <param name="initargs">コンストラクタ呼び出しに引数として渡すオブジェクトの配列。</param>
+        /// <returns>このオブジェクトが表すコンストラクタを呼び出すことで作成される新規オブジェクト。</returns>
+        /// <remarks>
+        /// コンストラクタには、<c>SetConstructor()</c> で指定されたメソッドを用いる。
+        /// 指定されていない場合は、デフォルトコンストラクタを使用する。
+        /// オブジェクトの生成に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。
+        /// </remarks>
+        public T NewInstance(params object[] initargs)
+        {
+            try
+            {
+                // コンストラクタが指定されておらず、パラメータも0件の場合
+                if (this.constructor == null
+                        && (initargs == null || initargs.Length == 0))
+                {
+                    // デフォルトコンストラクタを使用する
+                    this.SetConstructor();
+                }
+
+                // 指定されているコンストラクタでオブジェクトを生成
+                this.Instance = (T)this.constructor.Invoke(initargs);
+
+                // 生成したオブジェクトを返す
+                return this.Instance;
+            }
+            catch (TargetInvocationException e)
+            {
+                // コンストラクタが例外を投げる場合は、そのまま返す
+                throw e.InnerException;
+            }
+            catch (Exception e)
+            {
+                // オブジェクトが生成できない場合、テスト失敗
+                Assert.Fail(e.Message);
+
+                // failの時点で処理は終了する、コンパイルエラー抑止
+                throw new Exception("Accessor error", e);
+            }
+        }
+
+        /// <summary>
+        /// テストするメソッドを指定する。
+        /// </summary>
+        /// <param name="name">メソッドの名前。</param>
+        /// <param name="parameterTypes">パラメータ配列。</param>
+        /// <remarks>メソッドの確保に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>
+        public void SetMethod(string name, params Type[] parameterTypes)
+        {
+            try
+            {
+                // 指定されたメソッドを取得
+                this.method = typeof(T).GetMethod(
+                    name,
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
+                    null,
+                    parameterTypes,
+                    null);
+                if (this.method == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail(name + " is not found");
+                }
+            }
+            catch (Exception e)
+            {
+                // メソッド指定誤り、アクセス不可も含め全てテスト失敗
+                Assert.Fail(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// 指定されているメソッドを実行する。
+        /// </summary>
+        /// <param name="args">メソッド呼び出しに使用される引数。</param>
+        /// <returns>このオブジェクトが表すメソッドを、パラメータ<para>args</para>を使用して実行した結果。</returns>
+        /// <remarks>
+        /// staticメソッド以外の場合必要な呼び出し元オブジェクトには、
+        /// <c>NewInstance()</c> または <c> SetInstance()</c>
+        /// で指定されたオブジェクトを用いる。
+        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。
+        /// メソッドの実行に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。
+        /// </remarks>
+        public object Invoke(params object[] args)
+        {
+            try
+            {
+                // オブジェクトが指定されておらず、非staticメソッドの場合
+                if (this.Instance == null && !this.method.IsStatic)
+                {
+                    // デフォルトコンストラクタでオブジェクトを作成する
+                    // ※ コンストラクタが指定されている場合、例外
+                    this.NewInstance();
+                }
+
+                // 指定されているオブジェクトでメソッドを実行
+                return this.method.Invoke(this.Instance, args);
+            }
+            catch (TargetInvocationException e)
+            {
+                // メソッドが例外を投げる場合は、そのまま返す
+                throw e.InnerException;
+            }
+            catch (Exception e)
+            {
+                // メソッド未設定、型違いも含めて全てテスト失敗
+                Assert.Fail(e.Message);
+
+                // failの時点で処理は終了する、コンパイルエラー抑止
+                throw new Exception("Accessor error", e);
+            }
+        }
+
+        /// <summary>
+        /// テストする/したクラスのオブジェクトより、指定されたフィールドの値を返す。
+        /// </summary>
+        /// <param name="name">フィールド名。</param>
+        /// <returns>フィールドの値。</returns>
+        /// <remarks>値の取得に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>
+        public object GetField(string name)
+        {
+            try
+            {
+                // 指定されたフィールドを取得
+                FieldInfo field = typeof(T).GetField(
+                    name,
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
+                if (field == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail(name + " is not found");
+                }
+
+                // 指定された値をフィールドから取得する
+                return field.GetValue(this.Instance);
+            }
+            catch (Exception e)
+            {
+                // フィールド指定誤り、アクセス不可、オブジェクト無しも含め全てテスト失敗
+                Assert.Fail(e.Message);
+
+                // failの時点で処理は終了する、コンパイルエラー抑止
+                throw new Exception("Accessor error", e);
+            }
+        }
+
+        /// <summary>
+        /// テストするクラスのオブジェクトで、指定されたフィールドに値を設定する。
+        /// </summary>
+        /// <param name="name">フィールド名。</param>
+        /// <param name="value">新しいフィールド値。</param>
+        /// <remarks>
+        /// staticフィールド以外の場合に必要な設定先オブジェクトには、
+        /// <c>NewInstance()</c> または <c> SetInstance()</c>
+        /// で指定されたオブジェクトを用いる。
+        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。
+        /// 値の設定に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。
+        /// </remarks>
+        public void SetField(string name, object value)
+        {
+            try
+            {
+                // 指定されたフィールドを取得
+                FieldInfo field = typeof(T).GetField(
+                    name,
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
+                if (field == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail(name + " is not found");
+                }
+
+                // オブジェクトが指定されておらず、非staticフィールドの場合
+                if (this.Instance == null && !field.IsStatic)
+                {
+                    // デフォルトコンストラクタでオブジェクトを作成する
+                    // ※ コンストラクタが指定されている場合、例外
+                    this.NewInstance();
+                }
+
+                // 指定された値をフィールドに設定する
+                field.SetValue(this.Instance, value);
+            }
+            catch (Exception e)
+            {
+                // フィールド指定誤り、アクセス不可も含め全てテスト失敗
+                Assert.Fail(e.Message);
+            }
+        }
+
+        /// <summary>
+        /// テストする/したクラスのオブジェクトより、指定されたプロパティの値を返す。
+        /// </summary>
+        /// <param name="name">プロパティ名。</param>
+        /// <returns>プロパティの値。</returns>
+        /// <remarks>値の取得に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。</remarks>
+        public object GetProperty(string name, params object[] index)
+        {
+            try
+            {
+                // 指定されたプロパティを取得
+                PropertyInfo property = typeof(T).GetProperty(
+                    name,
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+                if (property == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail(name + " is not found");
+                }
+
+                // 指定された値をプロパティから取得する
+                return property.GetValue(this.Instance, index);
+            }
+            catch (Exception e)
+            {
+                // プロパティ指定誤り、アクセス不可、オブジェクト無しも含め全てテスト失敗
+                Assert.Fail(e.Message);
+
+                // failの時点で処理は終了する、コンパイルエラー抑止
+                throw new Exception("Accessor error", e);
+            }
+        }
+
+        /// <summary>
+        /// テストするクラスのオブジェクトで、指定されたプロパティに値を設定する。
+        /// </summary>
+        /// <param name="name">プロパティ名。</param>
+        /// <param name="value">新しいプロパティ値。</param>
+        /// <remarks>
+        /// 設定先オブジェクトには <c>NewInstance()</c> または <c> SetInstance()</c>
+        /// で指定されたオブジェクトを用いる。
+        /// 指定されていない場合は、可能であればデフォルトコンストラクタでオブジェクトを生成する。
+        /// 値の設定に失敗した場合は、<c>Assert.Fail()</c> にてテストを失敗させる。
+        /// </remarks>
+        public void SetProperty(string name, object value, params object[] index)
+        {
+            try
+            {
+                // 指定されたプロパティを取得
+                PropertyInfo property = typeof(T).GetProperty(
+                    name,
+                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+                if (property == null)
+                {
+                    // メソッド取得失敗のためテスト失敗
+                    Assert.Fail(name + " is not found");
+                }
+
+                // オブジェクトが指定されていない場合
+                if (this.Instance == null)
+                {
+                    // デフォルトコンストラクタでオブジェクトを作成する
+                    // ※ コンストラクタが指定されている場合、例外
+                    this.NewInstance();
+                }
+
+                // 指定された値をプロパティに設定する
+                property.SetValue(this.Instance, value, index);
+            }
+            catch (TargetInvocationException e)
+            {
+                // メソッドが例外を投げる場合は、そのまま返す
+                throw e.InnerException;
+            }
+            catch (Exception e)
+            {
+                // プロパティ指定誤り、アクセス不可も含め全てテスト失敗
+                Assert.Fail(e.Message);
+            }
+        }
+
+        #endregion
+    }
+}
index 2f196c3..32aa47b 100644 (file)
@@ -1,35 +1,35 @@
-using System.Reflection;\r
-using System.Runtime.CompilerServices;\r
-using System.Runtime.InteropServices;\r
-\r
-// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\r
-// アセンブリに関連付けられている情報を変更するには、\r
-// これらの属性値を変更してください。\r
-[assembly: AssemblyTitle("Wikipedia 翻訳支援ツール(テスト)")]\r
-[assembly: AssemblyDescription("Wikipediaでの言語間翻訳をサポートするためのツール(テスト)")]\r
-[assembly: AssemblyConfiguration("")]\r
-[assembly: AssemblyCompany("")]\r
-[assembly: AssemblyProduct("Wikipedia 翻訳支援ツール")]\r
-[assembly: AssemblyCopyright("Copyright (C) Honeplus 2010")]\r
-[assembly: AssemblyTrademark("")]\r
-[assembly: AssemblyCulture("")]\r
-\r
-// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \r
-// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\r
-// その型の ComVisible 属性を true に設定してください。\r
-[assembly: ComVisible(false)]\r
-\r
-// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\r
-[assembly: Guid("5647fe41-0fd2-455b-87d3-467301863a4c")]\r
-\r
-// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\r
-//\r
-//      Major Version\r
-//      Minor Version \r
-//      Build Number\r
-//      Revision\r
-//\r
-// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \r
-// 既定値にすることができます:\r
-// [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("0.80.*")]\r
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
+// アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更してください。
+[assembly: AssemblyTitle("Wikipedia 翻訳支援ツール(テスト)")]
+[assembly: AssemblyDescription("Wikipediaでの言語間翻訳をサポートするためのツール(テスト)")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Wikipedia 翻訳支援ツール")]
+[assembly: AssemblyCopyright("Copyright (C) Honeplus 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから 
+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
+[assembly: Guid("5647fe41-0fd2-455b-87d3-467301863a4c")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を 
+// 既定値にすることができます:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.80.*")]
index 57d12f9..81b3613 100644 (file)
@@ -1,86 +1,86 @@
-// ================================================================================================\r
-// <summary>\r
-//      FormUtilsのテストクラスソース。</summary>\r
-//\r
-// <copyright file="FormUtilsTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Windows.Forms;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// FormUtilsのテストクラスです。\r
-    /// </summary>\r
-    /// <remarks>\r
-    /// その性質上、画面周りのメソッドならびに設定ファイル関連のメソッドについてはテストケースが作成できていない。\r
-    /// これらのメソッドに手を入れる際は注意すること。\r
-    /// </remarks>\r
-    [TestFixture]\r
-    public class FormUtilsTest\r
-    {\r
-        /// <summary>\r
-        /// Websiteテスト用のモッククラスです。\r
-        /// </summary>\r
-        public class DummyCell : DataGridViewCell \r
-        {\r
-        }\r
-\r
-        #region リソース関連テストケース\r
-        \r
-        /// <summary>\r
-        /// ReplaceInvalidFileNameCharsメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestApplicationName()\r
-        {\r
-            // ※ バージョンが変わるごとにバージョン表記の部分を書き換えるのは面倒なので置換\r
-            Assert.AreEqual(\r
-                "Wikipedia 翻訳支援ツール VerX.XX",\r
-                new System.Text.RegularExpressions.Regex("Ver[0-9]+\\.[0-9]+")\r
-                .Replace(FormUtils.ApplicationName(), "VerX.XX"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// ReplaceInvalidFileNameCharsメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestReplaceInvalidFileNameChars()\r
-        {\r
-            Assert.AreEqual("C__test_test.doc", FormUtils.ReplaceInvalidFileNameChars("C:\\test\\test.doc"));\r
-            Assert.AreEqual("_home_test_test.doc", FormUtils.ReplaceInvalidFileNameChars("/home/test/test.doc"));\r
-            Assert.AreEqual("______", FormUtils.ReplaceInvalidFileNameChars("*?\"<>|"));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region null値許容メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// ToStringメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestToString()\r
-        {\r
-            // 引数二つ\r
-            Assert.IsNull(FormUtils.ToString(null, null));\r
-            Assert.IsNull(FormUtils.ToString(new DummyCell(), null));\r
-            Assert.AreEqual("null", FormUtils.ToString(new DummyCell(), "null"));\r
-            Assert.AreEqual("not null", FormUtils.ToString(new DummyCell { Value = "not null" }, "null"));\r
-            Assert.AreNotEqual("null", FormUtils.ToString(new DummyCell { Value = new object() }, "null"));\r
-\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, FormUtils.ToString(null));\r
-            Assert.AreEqual(String.Empty, FormUtils.ToString(new DummyCell()));\r
-            Assert.AreEqual("not null", FormUtils.ToString(new DummyCell { Value = "not null" }));\r
-            Assert.IsNotEmpty(FormUtils.ToString(new DummyCell { Value = new object() }));\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      FormUtilsのテストクラスソース。</summary>
+//
+// <copyright file="FormUtilsTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Windows.Forms;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// FormUtilsのテストクラスです。
+    /// </summary>
+    /// <remarks>
+    /// その性質上、画面周りのメソッドならびに設定ファイル関連のメソッドについてはテストケースが作成できていない。
+    /// これらのメソッドに手を入れる際は注意すること。
+    /// </remarks>
+    [TestFixture]
+    public class FormUtilsTest
+    {
+        /// <summary>
+        /// Websiteテスト用のモッククラスです。
+        /// </summary>
+        public class DummyCell : DataGridViewCell 
+        {
+        }
+
+        #region リソース関連テストケース
+        
+        /// <summary>
+        /// ReplaceInvalidFileNameCharsメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestApplicationName()
+        {
+            // ※ バージョンが変わるごとにバージョン表記の部分を書き換えるのは面倒なので置換
+            Assert.AreEqual(
+                "Wikipedia 翻訳支援ツール VerX.XX",
+                new System.Text.RegularExpressions.Regex("Ver[0-9]+\\.[0-9]+")
+                .Replace(FormUtils.ApplicationName(), "VerX.XX"));
+        }
+
+        /// <summary>
+        /// ReplaceInvalidFileNameCharsメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestReplaceInvalidFileNameChars()
+        {
+            Assert.AreEqual("C__test_test.doc", FormUtils.ReplaceInvalidFileNameChars("C:\\test\\test.doc"));
+            Assert.AreEqual("_home_test_test.doc", FormUtils.ReplaceInvalidFileNameChars("/home/test/test.doc"));
+            Assert.AreEqual("______", FormUtils.ReplaceInvalidFileNameChars("*?\"<>|"));
+        }
+
+        #endregion
+
+        #region null値許容メソッドテストケース
+
+        /// <summary>
+        /// ToStringメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestToString()
+        {
+            // 引数二つ
+            Assert.IsNull(FormUtils.ToString(null, null));
+            Assert.IsNull(FormUtils.ToString(new DummyCell(), null));
+            Assert.AreEqual("null", FormUtils.ToString(new DummyCell(), "null"));
+            Assert.AreEqual("not null", FormUtils.ToString(new DummyCell { Value = "not null" }, "null"));
+            Assert.AreNotEqual("null", FormUtils.ToString(new DummyCell { Value = new object() }, "null"));
+
+            // 引数一つ
+            Assert.AreEqual(String.Empty, FormUtils.ToString(null));
+            Assert.AreEqual(String.Empty, FormUtils.ToString(new DummyCell()));
+            Assert.AreEqual("not null", FormUtils.ToString(new DummyCell { Value = "not null" }));
+            Assert.IsNotEmpty(FormUtils.ToString(new DummyCell { Value = new object() }));
+        }
+
+        #endregion
+    }
+}
index 9489cf7..7dfc711 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      LazyXmlParserのテストクラスソース。</summary>\r
-//\r
-// <copyright file="LazyXmlParserTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// LazyXmlParserのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class LazyXmlParserTest\r
-    {\r
-        #region 静的メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// TryParseCommentメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseComment()\r
-        {\r
-            string comment;\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test-->", out comment));\r
-            Assert.AreEqual("<!--test-->", comment);\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!-- test -->", out comment));\r
-            Assert.AreEqual("<!-- test -->", comment);\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test-->-->", out comment));\r
-            Assert.AreEqual("<!--test-->", comment);\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test--", out comment));\r
-            Assert.AreEqual("<!--test--", comment);\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--->", out comment));\r
-            Assert.AreEqual("<!--->", comment);\r
-            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--\n\ntest\r\n-->", out comment));\r
-            Assert.AreEqual("<!--\n\ntest\r\n-->", comment);\r
-            Assert.IsFalse(LazyXmlParser.TryParseComment("<--test-->", out comment));\r
-            Assert.IsNull(comment);\r
-            Assert.IsFalse(LazyXmlParser.TryParseComment("<%--test--%>", out comment));\r
-            Assert.IsNull(comment);\r
-            Assert.IsFalse(LazyXmlParser.TryParseComment("<! --test-->", out comment));\r
-            Assert.IsNull(comment);\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 公開メソッドテストケース\r
-        \r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(実例)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParse()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsTrue(parser.TryParse("<h1>test</h1>", out element));\r
-            Assert.AreEqual("<h1>test</h1>", element.OuterXml);\r
-            Assert.AreEqual("h1", element.Name);\r
-            Assert.AreEqual("test", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<br /><br />test<br />", out element));\r
-            Assert.AreEqual("<br />", element.OuterXml);\r
-            Assert.AreEqual("br", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div><br />", out element));\r
-            Assert.AreEqual("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div>", element.OuterXml);\r
-            Assert.AreEqual("div", element.Name);\r
-            Assert.AreEqual("<!--<div id=\"indiv\">test</div>-->", element.InnerXml);\r
-            Assert.AreEqual(2, element.Attributes.Count);\r
-            Assert.AreEqual("testid", element.GetAttribute("id"));\r
-            Assert.AreEqual("testname", element.GetAttribute("name"));\r
-\r
-            parser.IsHtml = true;\r
-            Assert.IsTrue(parser.TryParse("<p>段落1<p>段落2", out element));\r
-            Assert.AreEqual("<p>", element.OuterXml);\r
-            Assert.AreEqual("p", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<input type=\"checkbox\" name=\"param\" value=\"test\" checked><label for=\"param\">チェック</label>", out element));\r
-            Assert.AreEqual("<input type=\"checkbox\" name=\"param\" value=\"test\" checked>", element.OuterXml);\r
-            Assert.AreEqual("input", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(4, element.Attributes.Count);\r
-            Assert.AreEqual("checkbox", element.GetAttribute("type"));\r
-            Assert.AreEqual("param", element.GetAttribute("name"));\r
-            Assert.AreEqual("test", element.GetAttribute("value"));\r
-            Assert.IsEmpty(element.GetAttribute("checked"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(基本形)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseNormal()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsTrue(parser.TryParse("<testtag></testtag>", out element));\r
-            Assert.AreEqual("<testtag></testtag>", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag2>test value</testtag2>", out element));\r
-            Assert.AreEqual("<testtag2>test value</testtag2>", element.OuterXml);\r
-            Assert.AreEqual("testtag2", element.Name);\r
-            Assert.AreEqual("test value", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag3> test value2 </testtag3>testend", out element));\r
-            Assert.AreEqual("<testtag3> test value2 </testtag3>", element.OuterXml);\r
-            Assert.AreEqual("testtag3", element.Name);\r
-            Assert.AreEqual(" test value2 ", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>testend", out element));\r
-            Assert.AreEqual("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>", element.OuterXml);\r
-            Assert.AreEqual("testtag4", element.Name);\r
-            Assert.AreEqual(" test<!-- </testtag4> --> value3 ", element.InnerXml);\r
-            Assert.AreEqual(1, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));\r
-            \r
-            Assert.IsTrue(parser.TryParse("<testtag5 testattr2='testvalue2'><testbody></testtag5 >testend", out element));\r
-            Assert.AreEqual("<testtag5 testattr2='testvalue2'><testbody></testtag5 >", element.OuterXml);\r
-            Assert.AreEqual("testtag5", element.Name);\r
-            Assert.AreEqual("<testbody>", element.InnerXml);\r
-            Assert.AreEqual(1, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(普通でNGパターン)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseNormalNg()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsFalse(parser.TryParse(" <testtag></testtag>", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<!-- comment -->", out element));\r
-            Assert.IsNull(element);\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(単一のパターン)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseSingle()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsTrue(parser.TryParse("<testtag />", out element));\r
-            Assert.AreEqual("<testtag />", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag2/>", out element));\r
-            Assert.AreEqual("<testtag2/>", element.OuterXml);\r
-            Assert.AreEqual("testtag2", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag3   />testtag4 />", out element));\r
-            Assert.AreEqual("<testtag3   />", element.OuterXml);\r
-            Assert.AreEqual("testtag3", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag5 testattr=\"testvalue\" />/>", out element));\r
-            Assert.AreEqual("<testtag5 testattr=\"testvalue\" />", element.OuterXml);\r
-            Assert.AreEqual("testtag5", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(1, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>/>", out element));\r
-            Assert.AreEqual("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>", element.OuterXml);\r
-            Assert.AreEqual("testtag6", element.Name);\r
-            Assert.AreEqual(2, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue1", element.GetAttribute("testattr1"));\r
-            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(不正な構文)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseLazy()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsTrue(parser.TryParse("<p>", out element));\r
-            Assert.AreEqual("<p>", element.OuterXml);\r
-            Assert.AreEqual("p", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag>test value", out element));\r
-            Assert.AreEqual("<testtag>test value", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.AreEqual("test value", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag2 testattr=test value>test value</testtag2>", out element));\r
-            Assert.AreEqual("<testtag2 testattr=test value>test value</testtag2>", element.OuterXml);\r
-            Assert.AreEqual("testtag2", element.Name);\r
-            Assert.AreEqual("test value", element.InnerXml);\r
-            Assert.AreEqual(2, element.Attributes.Count);\r
-            Assert.AreEqual("test", element.GetAttribute("testattr"));\r
-            Assert.IsEmpty(element.GetAttribute("value"));\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag3>test value2</ testtag3>testend", out element));\r
-            Assert.AreEqual("<testtag3>test value2</ testtag3>testend", element.OuterXml);\r
-            Assert.AreEqual("testtag3", element.Name);\r
-            Assert.AreEqual("test value2</ testtag3>testend", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-        }\r
-\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(不正でNG)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseLazyNg()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser();\r
-            Assert.IsFalse(parser.TryParse("< testtag></testtag>", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<testtag", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<testtag ", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<testtag /", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<testtag </testtag>", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<testtag testattr=\"testvalue'></testtag>", out element));\r
-            Assert.IsNull(element);\r
-            Assert.IsFalse(parser.TryParse("<sub((>4</sub>", out element));\r
-            Assert.IsNull(element);\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(HTML)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseHtml()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser { IsHtml = true };\r
-            Assert.IsTrue(parser.TryParse("<testtag />", out element));\r
-            Assert.AreEqual("<testtag />", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<p>", out element));\r
-            Assert.AreEqual("<p>", element.OuterXml);\r
-            Assert.AreEqual("p", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag2 />testtag3 />", out element));\r
-            Assert.AreEqual("<testtag2 />", element.OuterXml);\r
-            Assert.AreEqual("testtag2", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag4></testtag5>", out element));\r
-            Assert.AreEqual("<testtag4>", element.OuterXml);\r
-            Assert.AreEqual("testtag4", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag6 testattr=\"testvalue\">>", out element));\r
-            Assert.AreEqual("<testtag6 testattr=\"testvalue\">", element.OuterXml);\r
-            Assert.AreEqual("testtag6", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(1, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", out element));\r
-            Assert.AreEqual("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", element.OuterXml);\r
-            Assert.AreEqual("testtag7", element.Name);\r
-            Assert.AreEqual(2, element.Attributes.Count);\r
-            Assert.AreEqual("testvalue1", element.GetAttribute("testattr1"));\r
-            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// TryParseメソッドテストケース(大文字小文字)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestTryParseIgnoreCase()\r
-        {\r
-            LazyXmlParser.SimpleElement element;\r
-            LazyXmlParser parser = new LazyXmlParser { IgnoreCase = false };\r
-            Assert.IsTrue(parser.TryParse("<testtag></testtag></Testtag>", out element));\r
-            Assert.AreEqual("<testtag></testtag>", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));\r
-            Assert.AreEqual("<testtag></Testtag></testtag>", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.AreEqual("</Testtag>", element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-\r
-            parser.IgnoreCase = true;\r
-            Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));\r
-            Assert.AreEqual("<testtag></Testtag>", element.OuterXml);\r
-            Assert.AreEqual("testtag", element.Name);\r
-            Assert.IsEmpty(element.InnerXml);\r
-            Assert.AreEqual(0, element.Attributes.Count);\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      LazyXmlParserのテストクラスソース。</summary>
+//
+// <copyright file="LazyXmlParserTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// LazyXmlParserのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class LazyXmlParserTest
+    {
+        #region 静的メソッドテストケース
+
+        /// <summary>
+        /// TryParseCommentメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestTryParseComment()
+        {
+            string comment;
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test-->", out comment));
+            Assert.AreEqual("<!--test-->", comment);
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!-- test -->", out comment));
+            Assert.AreEqual("<!-- test -->", comment);
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test-->-->", out comment));
+            Assert.AreEqual("<!--test-->", comment);
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--test--", out comment));
+            Assert.AreEqual("<!--test--", comment);
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--->", out comment));
+            Assert.AreEqual("<!--->", comment);
+            Assert.IsTrue(LazyXmlParser.TryParseComment("<!--\n\ntest\r\n-->", out comment));
+            Assert.AreEqual("<!--\n\ntest\r\n-->", comment);
+            Assert.IsFalse(LazyXmlParser.TryParseComment("<--test-->", out comment));
+            Assert.IsNull(comment);
+            Assert.IsFalse(LazyXmlParser.TryParseComment("<%--test--%>", out comment));
+            Assert.IsNull(comment);
+            Assert.IsFalse(LazyXmlParser.TryParseComment("<! --test-->", out comment));
+            Assert.IsNull(comment);
+        }
+
+        #endregion
+
+        #region 公開メソッドテストケース
+        
+        /// <summary>
+        /// TryParseメソッドテストケース(実例)。
+        /// </summary>
+        [Test]
+        public void TestTryParse()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsTrue(parser.TryParse("<h1>test</h1>", out element));
+            Assert.AreEqual("<h1>test</h1>", element.OuterXml);
+            Assert.AreEqual("h1", element.Name);
+            Assert.AreEqual("test", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<br /><br />test<br />", out element));
+            Assert.AreEqual("<br />", element.OuterXml);
+            Assert.AreEqual("br", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div><br />", out element));
+            Assert.AreEqual("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div>", element.OuterXml);
+            Assert.AreEqual("div", element.Name);
+            Assert.AreEqual("<!--<div id=\"indiv\">test</div>-->", element.InnerXml);
+            Assert.AreEqual(2, element.Attributes.Count);
+            Assert.AreEqual("testid", element.GetAttribute("id"));
+            Assert.AreEqual("testname", element.GetAttribute("name"));
+
+            parser.IsHtml = true;
+            Assert.IsTrue(parser.TryParse("<p>段落1<p>段落2", out element));
+            Assert.AreEqual("<p>", element.OuterXml);
+            Assert.AreEqual("p", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<input type=\"checkbox\" name=\"param\" value=\"test\" checked><label for=\"param\">チェック</label>", out element));
+            Assert.AreEqual("<input type=\"checkbox\" name=\"param\" value=\"test\" checked>", element.OuterXml);
+            Assert.AreEqual("input", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(4, element.Attributes.Count);
+            Assert.AreEqual("checkbox", element.GetAttribute("type"));
+            Assert.AreEqual("param", element.GetAttribute("name"));
+            Assert.AreEqual("test", element.GetAttribute("value"));
+            Assert.IsEmpty(element.GetAttribute("checked"));
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(基本形)。
+        /// </summary>
+        [Test]
+        public void TestTryParseNormal()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsTrue(parser.TryParse("<testtag></testtag>", out element));
+            Assert.AreEqual("<testtag></testtag>", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag2>test value</testtag2>", out element));
+            Assert.AreEqual("<testtag2>test value</testtag2>", element.OuterXml);
+            Assert.AreEqual("testtag2", element.Name);
+            Assert.AreEqual("test value", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag3> test value2 </testtag3>testend", out element));
+            Assert.AreEqual("<testtag3> test value2 </testtag3>", element.OuterXml);
+            Assert.AreEqual("testtag3", element.Name);
+            Assert.AreEqual(" test value2 ", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>testend", out element));
+            Assert.AreEqual("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>", element.OuterXml);
+            Assert.AreEqual("testtag4", element.Name);
+            Assert.AreEqual(" test<!-- </testtag4> --> value3 ", element.InnerXml);
+            Assert.AreEqual(1, element.Attributes.Count);
+            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));
+            
+            Assert.IsTrue(parser.TryParse("<testtag5 testattr2='testvalue2'><testbody></testtag5 >testend", out element));
+            Assert.AreEqual("<testtag5 testattr2='testvalue2'><testbody></testtag5 >", element.OuterXml);
+            Assert.AreEqual("testtag5", element.Name);
+            Assert.AreEqual("<testbody>", element.InnerXml);
+            Assert.AreEqual(1, element.Attributes.Count);
+            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(普通でNGパターン)。
+        /// </summary>
+        [Test]
+        public void TestTryParseNormalNg()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsFalse(parser.TryParse(" <testtag></testtag>", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<!-- comment -->", out element));
+            Assert.IsNull(element);
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(単一のパターン)。
+        /// </summary>
+        [Test]
+        public void TestTryParseSingle()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsTrue(parser.TryParse("<testtag />", out element));
+            Assert.AreEqual("<testtag />", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag2/>", out element));
+            Assert.AreEqual("<testtag2/>", element.OuterXml);
+            Assert.AreEqual("testtag2", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag3   />testtag4 />", out element));
+            Assert.AreEqual("<testtag3   />", element.OuterXml);
+            Assert.AreEqual("testtag3", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag5 testattr=\"testvalue\" />/>", out element));
+            Assert.AreEqual("<testtag5 testattr=\"testvalue\" />", element.OuterXml);
+            Assert.AreEqual("testtag5", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(1, element.Attributes.Count);
+            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));
+
+            Assert.IsTrue(parser.TryParse("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>/>", out element));
+            Assert.AreEqual("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>", element.OuterXml);
+            Assert.AreEqual("testtag6", element.Name);
+            Assert.AreEqual(2, element.Attributes.Count);
+            Assert.AreEqual("testvalue1", element.GetAttribute("testattr1"));
+            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(不正な構文)。
+        /// </summary>
+        [Test]
+        public void TestTryParseLazy()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsTrue(parser.TryParse("<p>", out element));
+            Assert.AreEqual("<p>", element.OuterXml);
+            Assert.AreEqual("p", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag>test value", out element));
+            Assert.AreEqual("<testtag>test value", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.AreEqual("test value", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag2 testattr=test value>test value</testtag2>", out element));
+            Assert.AreEqual("<testtag2 testattr=test value>test value</testtag2>", element.OuterXml);
+            Assert.AreEqual("testtag2", element.Name);
+            Assert.AreEqual("test value", element.InnerXml);
+            Assert.AreEqual(2, element.Attributes.Count);
+            Assert.AreEqual("test", element.GetAttribute("testattr"));
+            Assert.IsEmpty(element.GetAttribute("value"));
+
+            Assert.IsTrue(parser.TryParse("<testtag3>test value2</ testtag3>testend", out element));
+            Assert.AreEqual("<testtag3>test value2</ testtag3>testend", element.OuterXml);
+            Assert.AreEqual("testtag3", element.Name);
+            Assert.AreEqual("test value2</ testtag3>testend", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+        }
+
+
+        /// <summary>
+        /// TryParseメソッドテストケース(不正でNG)。
+        /// </summary>
+        [Test]
+        public void TestTryParseLazyNg()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser();
+            Assert.IsFalse(parser.TryParse("< testtag></testtag>", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<testtag", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<testtag ", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<testtag /", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<testtag </testtag>", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<testtag testattr=\"testvalue'></testtag>", out element));
+            Assert.IsNull(element);
+            Assert.IsFalse(parser.TryParse("<sub((>4</sub>", out element));
+            Assert.IsNull(element);
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(HTML)。
+        /// </summary>
+        [Test]
+        public void TestTryParseHtml()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser { IsHtml = true };
+            Assert.IsTrue(parser.TryParse("<testtag />", out element));
+            Assert.AreEqual("<testtag />", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<p>", out element));
+            Assert.AreEqual("<p>", element.OuterXml);
+            Assert.AreEqual("p", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag2 />testtag3 />", out element));
+            Assert.AreEqual("<testtag2 />", element.OuterXml);
+            Assert.AreEqual("testtag2", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag4></testtag5>", out element));
+            Assert.AreEqual("<testtag4>", element.OuterXml);
+            Assert.AreEqual("testtag4", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag6 testattr=\"testvalue\">>", out element));
+            Assert.AreEqual("<testtag6 testattr=\"testvalue\">", element.OuterXml);
+            Assert.AreEqual("testtag6", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(1, element.Attributes.Count);
+            Assert.AreEqual("testvalue", element.GetAttribute("testattr"));
+
+            Assert.IsTrue(parser.TryParse("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", out element));
+            Assert.AreEqual("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", element.OuterXml);
+            Assert.AreEqual("testtag7", element.Name);
+            Assert.AreEqual(2, element.Attributes.Count);
+            Assert.AreEqual("testvalue1", element.GetAttribute("testattr1"));
+            Assert.AreEqual("testvalue2", element.GetAttribute("testattr2"));
+        }
+
+        /// <summary>
+        /// TryParseメソッドテストケース(大文字小文字)。
+        /// </summary>
+        [Test]
+        public void TestTryParseIgnoreCase()
+        {
+            LazyXmlParser.SimpleElement element;
+            LazyXmlParser parser = new LazyXmlParser { IgnoreCase = false };
+            Assert.IsTrue(parser.TryParse("<testtag></testtag></Testtag>", out element));
+            Assert.AreEqual("<testtag></testtag>", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));
+            Assert.AreEqual("<testtag></Testtag></testtag>", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.AreEqual("</Testtag>", element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+
+            parser.IgnoreCase = true;
+            Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));
+            Assert.AreEqual("<testtag></Testtag>", element.OuterXml);
+            Assert.AreEqual("testtag", element.Name);
+            Assert.IsEmpty(element.InnerXml);
+            Assert.AreEqual(0, element.Attributes.Count);
+        }
+
+        #endregion
+    }
+}
index d208775..bfcb90d 100644 (file)
@@ -1,77 +1,77 @@
-// ================================================================================================\r
-// <summary>\r
-//      ObjectUtilsのテストクラスソース。</summary>\r
-//\r
-// <copyright file="ObjectUtilsTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// ObjectUtilsのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class ObjectUtilsTest\r
-    {\r
-        #region 初期化メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// Equalsメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestDefaultIfNull()\r
-        {\r
-            Assert.IsNull(ObjectUtils.DefaultIfNull<object>(null, null));\r
-            Assert.AreEqual(String.Empty, ObjectUtils.DefaultIfNull(String.Empty, "null"));\r
-            Assert.AreEqual("not null", ObjectUtils.DefaultIfNull("not null", "null"));\r
-            Assert.AreEqual("null", ObjectUtils.DefaultIfNull(null, "null"));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region null値許容メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// Equalsメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestEquals()\r
-        {\r
-            Assert.IsTrue(ObjectUtils.Equals(null, null));\r
-            Assert.IsFalse(ObjectUtils.Equals(null, String.Empty));\r
-            Assert.IsFalse(ObjectUtils.Equals(String.Empty, null));\r
-            Assert.IsTrue(ObjectUtils.Equals(String.Empty, String.Empty));\r
-            Assert.IsFalse(ObjectUtils.Equals(true, null));\r
-            Assert.IsFalse(ObjectUtils.Equals(true, "true"));\r
-            Assert.IsTrue(ObjectUtils.Equals(true, true));\r
-            Assert.IsFalse(ObjectUtils.Equals(true, false));\r
-        }\r
-\r
-        /// <summary>\r
-        /// ToStringメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestToString()\r
-        {\r
-            // 引数二つ\r
-            Assert.IsNull(ObjectUtils.ToString(null, null));\r
-            Assert.AreEqual(String.Empty, ObjectUtils.ToString(String.Empty, "null"));\r
-            Assert.AreEqual("not null", ObjectUtils.ToString("not null", "null"));\r
-            Assert.AreEqual("null", ObjectUtils.ToString(null, "null"));\r
-            Assert.IsNotEmpty(ObjectUtils.ToString(new object(), null));\r
-\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, ObjectUtils.ToString(null));\r
-            Assert.AreEqual("not null", ObjectUtils.ToString("not null"));\r
-            Assert.IsNotEmpty(ObjectUtils.ToString(new object()));\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      ObjectUtilsのテストクラスソース。</summary>
+//
+// <copyright file="ObjectUtilsTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// ObjectUtilsのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class ObjectUtilsTest
+    {
+        #region 初期化メソッドテストケース
+
+        /// <summary>
+        /// Equalsメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestDefaultIfNull()
+        {
+            Assert.IsNull(ObjectUtils.DefaultIfNull<object>(null, null));
+            Assert.AreEqual(String.Empty, ObjectUtils.DefaultIfNull(String.Empty, "null"));
+            Assert.AreEqual("not null", ObjectUtils.DefaultIfNull("not null", "null"));
+            Assert.AreEqual("null", ObjectUtils.DefaultIfNull(null, "null"));
+        }
+
+        #endregion
+
+        #region null値許容メソッドテストケース
+
+        /// <summary>
+        /// Equalsメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestEquals()
+        {
+            Assert.IsTrue(ObjectUtils.Equals(null, null));
+            Assert.IsFalse(ObjectUtils.Equals(null, String.Empty));
+            Assert.IsFalse(ObjectUtils.Equals(String.Empty, null));
+            Assert.IsTrue(ObjectUtils.Equals(String.Empty, String.Empty));
+            Assert.IsFalse(ObjectUtils.Equals(true, null));
+            Assert.IsFalse(ObjectUtils.Equals(true, "true"));
+            Assert.IsTrue(ObjectUtils.Equals(true, true));
+            Assert.IsFalse(ObjectUtils.Equals(true, false));
+        }
+
+        /// <summary>
+        /// ToStringメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestToString()
+        {
+            // 引数二つ
+            Assert.IsNull(ObjectUtils.ToString(null, null));
+            Assert.AreEqual(String.Empty, ObjectUtils.ToString(String.Empty, "null"));
+            Assert.AreEqual("not null", ObjectUtils.ToString("not null", "null"));
+            Assert.AreEqual("null", ObjectUtils.ToString(null, "null"));
+            Assert.IsNotEmpty(ObjectUtils.ToString(new object(), null));
+
+            // 引数一つ
+            Assert.AreEqual(String.Empty, ObjectUtils.ToString(null));
+            Assert.AreEqual("not null", ObjectUtils.ToString("not null"));
+            Assert.IsNotEmpty(ObjectUtils.ToString(new object()));
+        }
+
+        #endregion
+    }
+}
index 81544ab..24a39f1 100644 (file)
@@ -1,97 +1,97 @@
-// ================================================================================================\r
-// <summary>\r
-//      StringUtilsのテストクラスソース。</summary>\r
-//\r
-// <copyright file="StringUtilsTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Text;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// StringUtilsのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class StringUtilsTest\r
-    {\r
-        #region 初期化メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// DefaultStringメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestDefaultString()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, StringUtils.DefaultString(null));\r
-            Assert.AreEqual(String.Empty, StringUtils.DefaultString(String.Empty));\r
-            Assert.AreEqual(" ", StringUtils.DefaultString(" "));\r
-            Assert.AreEqual("null以外の文字列", StringUtils.DefaultString("null以外の文字列"));\r
-\r
-            // 引数二つ\r
-            Assert.AreEqual("初期値", StringUtils.DefaultString(null, "初期値"));\r
-            Assert.AreEqual(String.Empty, StringUtils.DefaultString(String.Empty, "初期値"));\r
-            Assert.AreEqual(" ", StringUtils.DefaultString(" ", "初期値"));\r
-            Assert.AreEqual("null以外の文字列", StringUtils.DefaultString("null以外の文字列", "初期値"));\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region 文字列チェックテストケース\r
-\r
-        /// <summary>\r
-        /// StartsWithメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestStartsWith()\r
-        {\r
-            // null\r
-            Assert.IsTrue(StringUtils.StartsWith(null, null, 3));\r
-            Assert.IsFalse(StringUtils.StartsWith(null, "", 2));\r
-            Assert.IsFalse(StringUtils.StartsWith("", null, 5));\r
-\r
-            // 空、文字数\r
-            Assert.IsFalse(StringUtils.StartsWith("", "", 0));\r
-            Assert.IsTrue(StringUtils.StartsWith("a", "", 0));\r
-            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "", 14));\r
-            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "", 15));\r
-            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "", -1));\r
-\r
-            // 通常\r
-            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "bc", 1));\r
-            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "ab", 1));\r
-            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "あいうえお", 10));\r
-            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "あいうえおか", 10));\r
-        }\r
-\r
-        /// <summary>\r
-        /// StartsWithメソッドテストケース(性能試験)。\r
-        /// </summary>\r
-        [Test, Timeout(1500)]\r
-        public void TestStartsWithResponse()\r
-        {\r
-            // テストデータとして適当な、ただしある文字が定期的に出現する長い文字列を生成\r
-            StringBuilder b = new StringBuilder();\r
-            int span = 0x7D - 0x20;\r
-            for (int i = 0; i < 100000; i++)\r
-            {\r
-                b.Append(Char.ConvertFromUtf32(i % span + 0x20));\r
-            }\r
-\r
-            // 先頭から最後までひたすら実行して時間がかかりすぎないかをチェック\r
-            string s = b.ToString();\r
-            for (int i = 0; i < s.Length; i++)\r
-            {\r
-                StringUtils.StartsWith(s, "a", i);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      StringUtilsのテストクラスソース。</summary>
+//
+// <copyright file="StringUtilsTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Text;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// StringUtilsのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class StringUtilsTest
+    {
+        #region 初期化メソッドテストケース
+
+        /// <summary>
+        /// DefaultStringメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestDefaultString()
+        {
+            // 引数一つ
+            Assert.AreEqual(String.Empty, StringUtils.DefaultString(null));
+            Assert.AreEqual(String.Empty, StringUtils.DefaultString(String.Empty));
+            Assert.AreEqual(" ", StringUtils.DefaultString(" "));
+            Assert.AreEqual("null以外の文字列", StringUtils.DefaultString("null以外の文字列"));
+
+            // 引数二つ
+            Assert.AreEqual("初期値", StringUtils.DefaultString(null, "初期値"));
+            Assert.AreEqual(String.Empty, StringUtils.DefaultString(String.Empty, "初期値"));
+            Assert.AreEqual(" ", StringUtils.DefaultString(" ", "初期値"));
+            Assert.AreEqual("null以外の文字列", StringUtils.DefaultString("null以外の文字列", "初期値"));
+        }
+
+        #endregion
+
+        #region 文字列チェックテストケース
+
+        /// <summary>
+        /// StartsWithメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestStartsWith()
+        {
+            // null
+            Assert.IsTrue(StringUtils.StartsWith(null, null, 3));
+            Assert.IsFalse(StringUtils.StartsWith(null, "", 2));
+            Assert.IsFalse(StringUtils.StartsWith("", null, 5));
+
+            // 空、文字数
+            Assert.IsFalse(StringUtils.StartsWith("", "", 0));
+            Assert.IsTrue(StringUtils.StartsWith("a", "", 0));
+            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "", 14));
+            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "", 15));
+            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "", -1));
+
+            // 通常
+            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "bc", 1));
+            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "ab", 1));
+            Assert.IsTrue(StringUtils.StartsWith("abcedf0123あいうえお", "あいうえお", 10));
+            Assert.IsFalse(StringUtils.StartsWith("abcedf0123あいうえお", "あいうえおか", 10));
+        }
+
+        /// <summary>
+        /// StartsWithメソッドテストケース(性能試験)。
+        /// </summary>
+        [Test, Timeout(1500)]
+        public void TestStartsWithResponse()
+        {
+            // テストデータとして適当な、ただしある文字が定期的に出現する長い文字列を生成
+            StringBuilder b = new StringBuilder();
+            int span = 0x7D - 0x20;
+            for (int i = 0; i < 100000; i++)
+            {
+                b.Append(Char.ConvertFromUtf32(i % span + 0x20));
+            }
+
+            // 先頭から最後までひたすら実行して時間がかかりすぎないかをチェック
+            string s = b.ToString();
+            for (int i = 0; i < s.Length; i++)
+            {
+                StringUtils.StartsWith(s, "a", i);
+            }
+        }
+
+        #endregion
+    }
+}
index 8384aee..b72fe8a 100644 (file)
-// ================================================================================================\r
-// <summary>\r
-//      Validateのテストクラスソース。</summary>\r
-//\r
-// <copyright file="ValidateTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// Validateのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class ValidateTest\r
-    {\r
-        #region NotNullメソッドテストケース\r
-\r
-        /// <summary>\r
-        /// NotNullメソッドテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotNull()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty));\r
-            Assert.AreEqual("not null", Validate.NotNull("not null"));\r
-\r
-            // 引数二つ\r
-            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty, null));\r
-            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty, "test"));\r
-            Assert.AreEqual("not null", Validate.NotNull("not null", "test"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// NotNullメソッドテストケース(異常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotNullNg()\r
-        {\r
-            try\r
-            {\r
-                // 引数一つ\r
-                Validate.NotNull<object>(null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("value", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つ\r
-                Validate.NotNull<object>(null, "test");\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("test", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つnull\r
-                Validate.NotNull<object>(null, null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.IsNull(ex.ParamName);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region NotEmptyメソッドテストケース\r
-\r
-        /// <summary>\r
-        /// NotEmptyメソッドテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotEmpty()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual("not empty", Validate.NotEmpty("not empty"));\r
-\r
-            // 引数二つ\r
-            Assert.AreEqual("not empty", Validate.NotEmpty("not empty", "test"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// NotEmptyメソッドテストケース(異常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotEmptyNg()\r
-        {\r
-            try\r
-            {\r
-                // 引数一つ\r
-                Validate.NotEmpty(null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("value", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つ\r
-                Validate.NotEmpty(null, "test");\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("test", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つnull\r
-                Validate.NotEmpty(null, null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.IsNull(ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数一つ\r
-                Validate.NotEmpty(String.Empty);\r
-                Assert.Fail("expected ArgumentException");\r
-            }\r
-            catch (ArgumentException ex)\r
-            {\r
-                Assert.AreEqual("value", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つ\r
-                Validate.NotEmpty(String.Empty, "test");\r
-                Assert.Fail("expected ArgumentException");\r
-            }\r
-            catch (ArgumentException ex)\r
-            {\r
-                Assert.AreEqual("test", ex.ParamName);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-\r
-        #region NotBlankメソッドテストケース\r
-\r
-        /// <summary>\r
-        /// NotBlankメソッドテストケース(正常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotBlank()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual("not blank", Validate.NotBlank("not blank"));\r
-\r
-            // 引数二つ\r
-            Assert.AreEqual("not blank", Validate.NotBlank("not blank", "test"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// NotBlankメソッドテストケース(異常系)。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestNotBlankNg()\r
-        {\r
-            try\r
-            {\r
-                // 引数一つ\r
-                Validate.NotBlank(null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("value", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つ\r
-                Validate.NotBlank(null, "test");\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.AreEqual("test", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つnull\r
-                Validate.NotBlank(null, null);\r
-                Assert.Fail("expected ArgumentNullException");\r
-            }\r
-            catch (ArgumentNullException ex)\r
-            {\r
-                Assert.IsNull(ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数一つ\r
-                Validate.NotBlank("  ");\r
-                Assert.Fail("expected ArgumentException");\r
-            }\r
-            catch (ArgumentException ex)\r
-            {\r
-                Assert.AreEqual("value", ex.ParamName);\r
-            }\r
-\r
-            try\r
-            {\r
-                // 引数二つ\r
-                Validate.NotBlank("   ", "test");\r
-                Assert.Fail("expected ArgumentException");\r
-            }\r
-            catch (ArgumentException ex)\r
-            {\r
-                Assert.AreEqual("test", ex.ParamName);\r
-            }\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      Validateのテストクラスソース。</summary>
+//
+// <copyright file="ValidateTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Validateのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class ValidateTest
+    {
+        #region NotNullメソッドテストケース
+
+        /// <summary>
+        /// NotNullメソッドテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestNotNull()
+        {
+            // 引数一つ
+            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty));
+            Assert.AreEqual("not null", Validate.NotNull("not null"));
+
+            // 引数二つ
+            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty, null));
+            Assert.AreEqual(String.Empty, Validate.NotNull(String.Empty, "test"));
+            Assert.AreEqual("not null", Validate.NotNull("not null", "test"));
+        }
+
+        /// <summary>
+        /// NotNullメソッドテストケース(異常系)。
+        /// </summary>
+        [Test]
+        public void TestNotNullNg()
+        {
+            try
+            {
+                // 引数一つ
+                Validate.NotNull<object>(null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("value", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つ
+                Validate.NotNull<object>(null, "test");
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("test", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つnull
+                Validate.NotNull<object>(null, null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.IsNull(ex.ParamName);
+            }
+        }
+
+        #endregion
+
+        #region NotEmptyメソッドテストケース
+
+        /// <summary>
+        /// NotEmptyメソッドテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestNotEmpty()
+        {
+            // 引数一つ
+            Assert.AreEqual("not empty", Validate.NotEmpty("not empty"));
+
+            // 引数二つ
+            Assert.AreEqual("not empty", Validate.NotEmpty("not empty", "test"));
+        }
+
+        /// <summary>
+        /// NotEmptyメソッドテストケース(異常系)。
+        /// </summary>
+        [Test]
+        public void TestNotEmptyNg()
+        {
+            try
+            {
+                // 引数一つ
+                Validate.NotEmpty(null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("value", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つ
+                Validate.NotEmpty(null, "test");
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("test", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つnull
+                Validate.NotEmpty(null, null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.IsNull(ex.ParamName);
+            }
+
+            try
+            {
+                // 引数一つ
+                Validate.NotEmpty(String.Empty);
+                Assert.Fail("expected ArgumentException");
+            }
+            catch (ArgumentException ex)
+            {
+                Assert.AreEqual("value", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つ
+                Validate.NotEmpty(String.Empty, "test");
+                Assert.Fail("expected ArgumentException");
+            }
+            catch (ArgumentException ex)
+            {
+                Assert.AreEqual("test", ex.ParamName);
+            }
+        }
+
+        #endregion
+
+        #region NotBlankメソッドテストケース
+
+        /// <summary>
+        /// NotBlankメソッドテストケース(正常系)。
+        /// </summary>
+        [Test]
+        public void TestNotBlank()
+        {
+            // 引数一つ
+            Assert.AreEqual("not blank", Validate.NotBlank("not blank"));
+
+            // 引数二つ
+            Assert.AreEqual("not blank", Validate.NotBlank("not blank", "test"));
+        }
+
+        /// <summary>
+        /// NotBlankメソッドテストケース(異常系)。
+        /// </summary>
+        [Test]
+        public void TestNotBlankNg()
+        {
+            try
+            {
+                // 引数一つ
+                Validate.NotBlank(null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("value", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つ
+                Validate.NotBlank(null, "test");
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.AreEqual("test", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つnull
+                Validate.NotBlank(null, null);
+                Assert.Fail("expected ArgumentNullException");
+            }
+            catch (ArgumentNullException ex)
+            {
+                Assert.IsNull(ex.ParamName);
+            }
+
+            try
+            {
+                // 引数一つ
+                Validate.NotBlank("  ");
+                Assert.Fail("expected ArgumentException");
+            }
+            catch (ArgumentException ex)
+            {
+                Assert.AreEqual("value", ex.ParamName);
+            }
+
+            try
+            {
+                // 引数二つ
+                Validate.NotBlank("   ", "test");
+                Assert.Fail("expected ArgumentException");
+            }
+            catch (ArgumentException ex)
+            {
+                Assert.AreEqual("test", ex.ParamName);
+            }
+        }
+
+        #endregion
+    }
+}
index 604f315..e513fda 100644 (file)
@@ -1,75 +1,75 @@
-// ================================================================================================\r
-// <summary>\r
-//      XmlUtilsのテストクラスソース。</summary>\r
-//\r
-// <copyright file="XmlUtilsTest.cs" company="honeplusのメモ帳">\r
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-//      Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
-    using System;\r
-    using System.Xml;\r
-    using NUnit.Framework;\r
-\r
-    /// <summary>\r
-    /// XmlUtilsのテストクラスです。\r
-    /// </summary>\r
-    [TestFixture]\r
-    public class XmlUtilsTest\r
-    {\r
-        #region null値許容メソッドテストケース\r
-\r
-        /// <summary>\r
-        /// InnerTextメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestInnerText()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, XmlUtils.InnerText(null));\r
-            Assert.AreEqual("test", XmlUtils.InnerText(new XmlDocument { InnerXml = "<dummy>test</dummy>" }));\r
-\r
-            // 引数二つ\r
-            Assert.IsNull(XmlUtils.InnerText(null, null));\r
-            Assert.AreEqual("null", XmlUtils.InnerText(null, "null"));\r
-            Assert.AreEqual("test", XmlUtils.InnerText(new XmlDocument { InnerXml = "<dummy>test</dummy>" }, "null"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// InnerXmlメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestInnerXml()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, XmlUtils.InnerXml(null));\r
-            Assert.AreEqual("<test />", XmlUtils.InnerXml(new XmlDocument { InnerXml = "<test />" }));\r
-\r
-            // 引数二つ\r
-            Assert.IsNull(XmlUtils.InnerText(null, null));\r
-            Assert.AreEqual("<null />", XmlUtils.InnerXml(null, "<null />"));\r
-            Assert.AreEqual("<test />", XmlUtils.InnerXml(new XmlDocument { InnerXml = "<test />" }, "<null />"));\r
-        }\r
-\r
-        /// <summary>\r
-        /// OuterXmlメソッドテストケース。\r
-        /// </summary>\r
-        [Test]\r
-        public void TestOuterXml()\r
-        {\r
-            // 引数一つ\r
-            Assert.AreEqual(String.Empty, XmlUtils.OuterXml(null));\r
-            Assert.AreEqual("<test />", XmlUtils.OuterXml(new XmlDocument { InnerXml = "<test />" }));\r
-\r
-            // 引数二つ\r
-            Assert.IsNull(XmlUtils.InnerText(null, null));\r
-            Assert.AreEqual("<null />", XmlUtils.OuterXml(null, "<null />"));\r
-            Assert.AreEqual("<test />", XmlUtils.OuterXml(new XmlDocument { InnerXml = "<test />" }, "<null />"));\r
-        }\r
-\r
-        #endregion\r
-    }\r
-}\r
+// ================================================================================================
+// <summary>
+//      XmlUtilsのテストクラスソース。</summary>
+//
+// <copyright file="XmlUtilsTest.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+//      Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+    using System;
+    using System.Xml;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// XmlUtilsのテストクラスです。
+    /// </summary>
+    [TestFixture]
+    public class XmlUtilsTest
+    {
+        #region null値許容メソッドテストケース
+
+        /// <summary>
+        /// InnerTextメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestInnerText()
+        {
+            // 引数一つ
+            Assert.AreEqual(String.Empty, XmlUtils.InnerText(null));
+            Assert.AreEqual("test", XmlUtils.InnerText(new XmlDocument { InnerXml = "<dummy>test</dummy>" }));
+
+            // 引数二つ
+            Assert.IsNull(XmlUtils.InnerText(null, null));
+            Assert.AreEqual("null", XmlUtils.InnerText(null, "null"));
+            Assert.AreEqual("test", XmlUtils.InnerText(new XmlDocument { InnerXml = "<dummy>test</dummy>" }, "null"));
+        }
+
+        /// <summary>
+        /// InnerXmlメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestInnerXml()
+        {
+            // 引数一つ
+            Assert.AreEqual(String.Empty, XmlUtils.InnerXml(null));
+            Assert.AreEqual("<test />", XmlUtils.InnerXml(new XmlDocument { InnerXml = "<test />" }));
+
+            // 引数二つ
+            Assert.IsNull(XmlUtils.InnerText(null, null));
+            Assert.AreEqual("<null />", XmlUtils.InnerXml(null, "<null />"));
+            Assert.AreEqual("<test />", XmlUtils.InnerXml(new XmlDocument { InnerXml = "<test />" }, "<null />"));
+        }
+
+        /// <summary>
+        /// OuterXmlメソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestOuterXml()
+        {
+            // 引数一つ
+            Assert.AreEqual(String.Empty, XmlUtils.OuterXml(null));
+            Assert.AreEqual("<test />", XmlUtils.OuterXml(new XmlDocument { InnerXml = "<test />" }));
+
+            // 引数二つ
+            Assert.IsNull(XmlUtils.InnerText(null, null));
+            Assert.AreEqual("<null />", XmlUtils.OuterXml(null, "<null />"));
+            Assert.AreEqual("<test />", XmlUtils.OuterXml(new XmlDocument { InnerXml = "<test />" }, "<null />"));
+        }
+
+        #endregion
+    }
+}
index 215dfb6..0e8c744 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <PropertyGroup>\r
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
-    <ProductVersion>8.0.30703</ProductVersion>\r
-    <SchemaVersion>2.0</SchemaVersion>\r
-    <ProjectGuid>{FDBDFBB8-2975-4521-87C6-D75CF9144DED}</ProjectGuid>\r
-    <OutputType>Library</OutputType>\r
-    <AppDesignerFolder>Properties</AppDesignerFolder>\r
-    <RootNamespace>Honememo.Wptscs</RootNamespace>\r
-    <AssemblyName>WptscsTest</AssemblyName>\r
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r
-    <FileAlignment>512</FileAlignment>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
-    <DebugSymbols>true</DebugSymbols>\r
-    <DebugType>full</DebugType>\r
-    <Optimize>false</Optimize>\r
-    <OutputPath>bin\Debug\</OutputPath>\r
-    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-    <StartAction>Program</StartAction>\r
-    <StartProgram>$(ProgramFiles)\NUnit 2.5.5\bin\net-2.0\nunit.exe</StartProgram>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
-    <DebugType>pdbonly</DebugType>\r
-    <Optimize>true</Optimize>\r
-    <OutputPath>bin\Release\</OutputPath>\r
-    <DefineConstants>TRACE</DefineConstants>\r
-    <ErrorReport>prompt</ErrorReport>\r
-    <WarningLevel>4</WarningLevel>\r
-  </PropertyGroup>\r
-  <ItemGroup>\r
-    <Reference Include="nunit.framework, Version=2.5.5.10112, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />\r
-    <Reference Include="System" />\r
-    <Reference Include="System.Windows.Forms" />\r
-    <Reference Include="System.XML" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <Compile Include="Logics\MediaWikiTranslatorTest.cs" />\r
-    <Compile Include="Models\ConfigTest.cs" />\r
-    <Compile Include="Models\IgnoreCaseDictionaryTest.cs" />\r
-    <Compile Include="Models\MediaWikiPageTest.cs" />\r
-    <Compile Include="Models\PageTest.cs" />\r
-    <Compile Include="Models\TestingConfig.cs" />\r
-    <Compile Include="Models\LanguageTest.cs" />\r
-    <Compile Include="Models\MediaWikiTest.cs" />\r
-    <Compile Include="Models\TranslationDictionaryTest.cs" />\r
-    <Compile Include="Models\TranslationTableTest.cs" />\r
-    <Compile Include="Models\WebsiteTest.cs" />\r
-    <Compile Include="PrivateAccessor.cs" />\r
-    <Compile Include="Properties\AssemblyInfo.cs" />\r
-    <Compile Include="Utilities\FormUtilsTest.cs" />\r
-    <Compile Include="Utilities\LazyXmlParserTest.cs" />\r
-    <Compile Include="Utilities\ObjectUtilsTest.cs" />\r
-    <Compile Include="Utilities\StringUtilsTest.cs" />\r
-    <Compile Include="Utilities\ValidateTest.cs" />\r
-    <Compile Include="Utilities\XmlUtilsTest.cs" />\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <ProjectReference Include="..\wptscs\Wptscs.csproj">\r
-      <Project>{4E20E523-0230-474C-B8F1-1E991360F5F5}</Project>\r
-      <Name>Wptscs</Name>\r
-    </ProjectReference>\r
-  </ItemGroup>\r
-  <ItemGroup />\r
-  <ItemGroup>\r
-    <Content Include="Data\config.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-      <SubType>Designer</SubType>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\.example.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Nothing Page.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\_api.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Example %28rapper%29.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\example.com.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\example.net.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\example.org.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\example.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Exemplar.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Exemplum.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Template_disambig.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Template_wikiquote.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\en\Template_wiktionary.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Category_宇宙船.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_cite news.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_cite web.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_commonscat.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_En icon.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_Infobox 航空機.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_ref-en.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_Reflist.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_Reflist_doc.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\Template_Reusable launch systems.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\VSSエンタープライズ.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\_api.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\カリフォルニア州.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\カーマン・ライン.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\スケールド・コンポジッツ.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\スペースシップツー.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\スペースシップワン.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\スペースシップ・カンパニー.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\スペースプレーン.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\ハイブリッドロケット.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\ホワイトナイトツー.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\ポール・アレン.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\モハーヴェ・エアロスペース・ベンチャーズ.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\モハーヴェ空港.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\リチャード・ブランソン.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\ヴァージン・ギャラクティック.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\ヴァージン・グループ.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\宇宙旅行.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\弾道飛行.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\民間宇宙飛行.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\熱圏.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\近点・遠点.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\ja\遠地点.xml">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\result\example.txt">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\result\example_キャッシュ使用.txt">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\result\example_定型句なし.txt">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-    <Content Include="Data\MediaWiki\result\スペースシップツー.txt">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </Content>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <None Include="Data\MediaWiki\result\example.log">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </None>\r
-    <None Include="Data\MediaWiki\result\example_キャッシュ使用.log">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </None>\r
-    <None Include="Data\MediaWiki\result\example_定型句なし.log">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </None>\r
-    <None Include="Data\MediaWiki\result\スペースシップツー.log">\r
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
-    </None>\r
-  </ItemGroup>\r
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
-       Other similar extension points exist, see Microsoft.Common.targets.\r
-  <Target Name="BeforeBuild">\r
-  </Target>\r
-  <Target Name="AfterBuild">\r
-  </Target>\r
-  -->\r
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{FDBDFBB8-2975-4521-87C6-D75CF9144DED}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Honememo.Wptscs</RootNamespace>
+    <AssemblyName>WptscsTest</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <StartAction>Program</StartAction>
+    <StartProgram>$(ProgramFiles)\NUnit 2.5.5\bin\net-2.0\nunit.exe</StartProgram>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.5.5.10112, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.XML" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Logics\MediaWikiTranslatorTest.cs" />
+    <Compile Include="Models\ConfigTest.cs" />
+    <Compile Include="Models\IgnoreCaseDictionaryTest.cs" />
+    <Compile Include="Models\MediaWikiPageTest.cs" />
+    <Compile Include="Models\PageTest.cs" />
+    <Compile Include="Models\TestingConfig.cs" />
+    <Compile Include="Models\LanguageTest.cs" />
+    <Compile Include="Models\MediaWikiTest.cs" />
+    <Compile Include="Models\TranslationDictionaryTest.cs" />
+    <Compile Include="Models\TranslationTableTest.cs" />
+    <Compile Include="Models\WebsiteTest.cs" />
+    <Compile Include="PrivateAccessor.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Utilities\FormUtilsTest.cs" />
+    <Compile Include="Utilities\LazyXmlParserTest.cs" />
+    <Compile Include="Utilities\ObjectUtilsTest.cs" />
+    <Compile Include="Utilities\StringUtilsTest.cs" />
+    <Compile Include="Utilities\ValidateTest.cs" />
+    <Compile Include="Utilities\XmlUtilsTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\wptscs\Wptscs.csproj">
+      <Project>{4E20E523-0230-474C-B8F1-1E991360F5F5}</Project>
+      <Name>Wptscs</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Content Include="Data\config.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+      <SubType>Designer</SubType>
+    </Content>
+    <Content Include="Data\MediaWiki\en\.example.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Nothing Page.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\_api.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Example %28rapper%29.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\example.com.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\example.net.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\example.org.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\example.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Exemplar.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Exemplum.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Template_disambig.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Template_wikiquote.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\en\Template_wiktionary.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Category_宇宙船.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_cite news.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_cite web.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_commonscat.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_En icon.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_Infobox 航空機.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_ref-en.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_Reflist.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_Reflist_doc.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\Template_Reusable launch systems.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\VSSエンタープライズ.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\_api.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\カリフォルニア州.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\カーマン・ライン.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\スケールド・コンポジッツ.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\スペースシップツー.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\スペースシップワン.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\スペースシップ・カンパニー.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\スペースプレーン.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\ハイブリッドロケット.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\ホワイトナイトツー.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\ポール・アレン.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\モハーヴェ・エアロスペース・ベンチャーズ.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\モハーヴェ空港.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\リチャード・ブランソン.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\ヴァージン・ギャラクティック.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\ヴァージン・グループ.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\宇宙旅行.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\弾道飛行.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\民間宇宙飛行.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\熱圏.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\近点・遠点.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\ja\遠地点.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\result\example.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\result\example_キャッシュ使用.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\result\example_定型句なし.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Data\MediaWiki\result\スペースシップツー.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Data\MediaWiki\result\example.log">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="Data\MediaWiki\result\example_キャッシュ使用.log">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="Data\MediaWiki\result\example_定型句なし.log">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="Data\MediaWiki\result\スペースシップツー.log">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
 </Project>
\ No newline at end of file