OSDN Git Service

Wikipedia翻訳支援ツール Ver1.01時点のソース
authorhoneplus <honeplus@users.osdn.me>
Mon, 30 Jan 2012 14:06:14 +0000 (14:06 +0000)
committerhoneplus <honeplus@users.osdn.me>
Mon, 30 Jan 2012 14:06:14 +0000 (14:06 +0000)
git-svn-id: http://svn.osdn.net/svnroot/wptscs/trunk@2 7cc79d57-4d93-40a1-83d5-ec7b38613dec

109 files changed:
Wikipedia 翻訳支援ツール.asta [new file with mode: 0644]
Wikipedia 翻訳支援ツール.sln [new file with mode: 0644]
Wptscs/App.ico [new file with mode: 0644]
Wptscs/ConfigForm.Designer.cs [new file with mode: 0644]
Wptscs/ConfigForm.cs [new file with mode: 0644]
Wptscs/ConfigForm.resx [new file with mode: 0644]
Wptscs/License.txt [new file with mode: 0644]
Wptscs/Logics/MediaWikiTranslator.cs [new file with mode: 0644]
Wptscs/Logics/Translator.cs [new file with mode: 0644]
Wptscs/MainForm.Designer.cs [new file with mode: 0644]
Wptscs/MainForm.cs [new file with mode: 0644]
Wptscs/MainForm.resx [new file with mode: 0644]
Wptscs/Models/Config.cs [new file with mode: 0644]
Wptscs/Models/IgnoreCaseDictionary.cs [new file with mode: 0644]
Wptscs/Models/Language.cs [new file with mode: 0644]
Wptscs/Models/MediaWiki.cs [new file with mode: 0644]
Wptscs/Models/MediaWikiPage.cs [new file with mode: 0644]
Wptscs/Models/Page.cs [new file with mode: 0644]
Wptscs/Models/TranslationDictionary.cs [new file with mode: 0644]
Wptscs/Models/TranslationTable.cs [new file with mode: 0644]
Wptscs/Models/Website.cs [new file with mode: 0644]
Wptscs/Program.cs [new file with mode: 0644]
Wptscs/Properties/AssemblyInfo.cs [new file with mode: 0644]
Wptscs/Properties/Resources.Designer.cs [new file with mode: 0644]
Wptscs/Properties/Resources.resx [new file with mode: 0644]
Wptscs/Properties/Settings.Designer.cs [new file with mode: 0644]
Wptscs/Properties/Settings.settings [new file with mode: 0644]
Wptscs/Readme.txt [new file with mode: 0644]
Wptscs/Settings.cs [new file with mode: 0644]
Wptscs/Utilities/FormUtils.cs [new file with mode: 0644]
Wptscs/Utilities/LazyXmlParser.cs [new file with mode: 0644]
Wptscs/Utilities/ObjectUtils.cs [new file with mode: 0644]
Wptscs/Utilities/StringUtils.cs [new file with mode: 0644]
Wptscs/Utilities/Validate.cs [new file with mode: 0644]
Wptscs/Utilities/XmlUtils.cs [new file with mode: 0644]
Wptscs/Wptscs.csproj [new file with mode: 0644]
Wptscs/app.config [new file with mode: 0644]
Wptscs/config.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/.example.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Example (rapper).xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Exemplar.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Exemplum.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Nothing Page.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Template_disambig.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Template_wikiquote.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/Template_wiktionary.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/_api.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/example.com.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/example.net.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/example.org.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/en/example.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Category_宇宙船.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_En icon.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_Infobox 航空機.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_Reflist.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_Reflist_doc.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_Reusable launch systems.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_cite news.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_cite web.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_commonscat.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/Template_ref-en.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/VSSエンタープライズ.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/_api.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/カリフォルニア州.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/カーマン・ライン.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/スケールド・コンポジッツ.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/スペースシップツー.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/スペースシップワン.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/スペースシップ・カンパニー.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/スペースプレーン.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/ハイブリッドロケット.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/ホワイトナイトツー.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/ポール・アレン.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/モハーヴェ・エアロスペース・ベンチャーズ.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/モハーヴェ空港.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/リチャード・ブランソン.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/ヴァージン・ギャラクティック.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/ヴァージン・グループ.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/宇宙旅行.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/弾道飛行.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/民間宇宙飛行.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/熱圏.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/近点・遠点.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/ja/遠地点.xml [new file with mode: 0644]
WptscsTest/Data/MediaWiki/result/example.txt [new file with mode: 0644]
WptscsTest/Data/MediaWiki/result/example_キャッシュ使用.txt [new file with mode: 0644]
WptscsTest/Data/MediaWiki/result/example_定型句なし.txt [new file with mode: 0644]
WptscsTest/Data/MediaWiki/result/スペースシップツー.txt [new file with mode: 0644]
WptscsTest/Data/config.xml [new file with mode: 0644]
WptscsTest/Logics/MediaWikiTranslatorTest.cs [new file with mode: 0644]
WptscsTest/Models/ConfigTest.cs [new file with mode: 0644]
WptscsTest/Models/IgnoreCaseDictionaryTest.cs [new file with mode: 0644]
WptscsTest/Models/LanguageTest.cs [new file with mode: 0644]
WptscsTest/Models/MediaWikiPageTest.cs [new file with mode: 0644]
WptscsTest/Models/MediaWikiTest.cs [new file with mode: 0644]
WptscsTest/Models/PageTest.cs [new file with mode: 0644]
WptscsTest/Models/TestingConfig.cs [new file with mode: 0644]
WptscsTest/Models/TranslationDictionaryTest.cs [new file with mode: 0644]
WptscsTest/Models/TranslationTableTest.cs [new file with mode: 0644]
WptscsTest/Models/WebsiteTest.cs [new file with mode: 0644]
WptscsTest/PrivateAccessor.cs [new file with mode: 0644]
WptscsTest/Properties/AssemblyInfo.cs [new file with mode: 0644]
WptscsTest/Utilities/FormUtilsTest.cs [new file with mode: 0644]
WptscsTest/Utilities/LazyXmlParserTest.cs [new file with mode: 0644]
WptscsTest/Utilities/ObjectUtilsTest.cs [new file with mode: 0644]
WptscsTest/Utilities/StringUtilsTest.cs [new file with mode: 0644]
WptscsTest/Utilities/ValidateTest.cs [new file with mode: 0644]
WptscsTest/Utilities/XmlUtilsTest.cs [new file with mode: 0644]
WptscsTest/WptscsTest.csproj [new file with mode: 0644]

diff --git a/Wikipedia 翻訳支援ツール.asta b/Wikipedia 翻訳支援ツール.asta
new file mode 100644 (file)
index 0000000..ac99a02
Binary files /dev/null and b/Wikipedia 翻訳支援ツール.asta differ
diff --git a/Wikipedia 翻訳支援ツール.sln b/Wikipedia 翻訳支援ツール.sln
new file mode 100644 (file)
index 0000000..5e86b71
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/App.ico b/Wptscs/App.ico
new file mode 100644 (file)
index 0000000..d827e5d
Binary files /dev/null and b/Wptscs/App.ico differ
diff --git a/Wptscs/ConfigForm.Designer.cs b/Wptscs/ConfigForm.Designer.cs
new file mode 100644 (file)
index 0000000..2d3cd3b
--- /dev/null
@@ -0,0 +1,682 @@
+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
+}
\ No newline at end of file
diff --git a/Wptscs/ConfigForm.cs b/Wptscs/ConfigForm.cs
new file mode 100644 (file)
index 0000000..2578fd1
--- /dev/null
@@ -0,0 +1,963 @@
+// ================================================================================================\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
diff --git a/Wptscs/ConfigForm.resx b/Wptscs/ConfigForm.resx
new file mode 100644 (file)
index 0000000..aead408
--- /dev/null
@@ -0,0 +1,2388 @@
+<?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
+</root>
\ No newline at end of file
diff --git a/Wptscs/License.txt b/Wptscs/License.txt
new file mode 100644 (file)
index 0000000..47b9cf5
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Logics/MediaWikiTranslator.cs b/Wptscs/Logics/MediaWikiTranslator.cs
new file mode 100644 (file)
index 0000000..6517dbc
--- /dev/null
@@ -0,0 +1,1060 @@
+// ================================================================================================\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
diff --git a/Wptscs/Logics/Translator.cs b/Wptscs/Logics/Translator.cs
new file mode 100644 (file)
index 0000000..43d11ec
--- /dev/null
@@ -0,0 +1,350 @@
+// ================================================================================================\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
diff --git a/Wptscs/MainForm.Designer.cs b/Wptscs/MainForm.Designer.cs
new file mode 100644 (file)
index 0000000..fa3082f
--- /dev/null
@@ -0,0 +1,275 @@
+// ================================================================================================\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
diff --git a/Wptscs/MainForm.cs b/Wptscs/MainForm.cs
new file mode 100644 (file)
index 0000000..391227c
--- /dev/null
@@ -0,0 +1,598 @@
+// ================================================================================================\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
+}
\ No newline at end of file
diff --git a/Wptscs/MainForm.resx b/Wptscs/MainForm.resx
new file mode 100644 (file)
index 0000000..aa08994
--- /dev/null
@@ -0,0 +1,681 @@
+<?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
+</root>
\ No newline at end of file
diff --git a/Wptscs/Models/Config.cs b/Wptscs/Models/Config.cs
new file mode 100644 (file)
index 0000000..10a72ac
--- /dev/null
@@ -0,0 +1,397 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/IgnoreCaseDictionary.cs b/Wptscs/Models/IgnoreCaseDictionary.cs
new file mode 100644 (file)
index 0000000..549a619
--- /dev/null
@@ -0,0 +1,388 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/Language.cs b/Wptscs/Models/Language.cs
new file mode 100644 (file)
index 0000000..c611aee
--- /dev/null
@@ -0,0 +1,210 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/MediaWiki.cs b/Wptscs/Models/MediaWiki.cs
new file mode 100644 (file)
index 0000000..4302895
--- /dev/null
@@ -0,0 +1,615 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/MediaWikiPage.cs b/Wptscs/Models/MediaWikiPage.cs
new file mode 100644 (file)
index 0000000..438e6e0
--- /dev/null
@@ -0,0 +1,1157 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/Page.cs b/Wptscs/Models/Page.cs
new file mode 100644 (file)
index 0000000..502842e
--- /dev/null
@@ -0,0 +1,136 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/TranslationDictionary.cs b/Wptscs/Models/TranslationDictionary.cs
new file mode 100644 (file)
index 0000000..f193564
--- /dev/null
@@ -0,0 +1,241 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/TranslationTable.cs b/Wptscs/Models/TranslationTable.cs
new file mode 100644 (file)
index 0000000..7fbc201
--- /dev/null
@@ -0,0 +1,161 @@
+// ================================================================================================\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
diff --git a/Wptscs/Models/Website.cs b/Wptscs/Models/Website.cs
new file mode 100644 (file)
index 0000000..61d78eb
--- /dev/null
@@ -0,0 +1,154 @@
+// ================================================================================================\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
diff --git a/Wptscs/Program.cs b/Wptscs/Program.cs
new file mode 100644 (file)
index 0000000..7132d3e
--- /dev/null
@@ -0,0 +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
+}
\ No newline at end of file
diff --git a/Wptscs/Properties/AssemblyInfo.cs b/Wptscs/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..80438f2
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Properties/Resources.Designer.cs b/Wptscs/Properties/Resources.Designer.cs
new file mode 100644 (file)
index 0000000..2606ce8
--- /dev/null
@@ -0,0 +1,498 @@
+//------------------------------------------------------------------------------\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
diff --git a/Wptscs/Properties/Resources.resx b/Wptscs/Properties/Resources.resx
new file mode 100644 (file)
index 0000000..b49079d
--- /dev/null
@@ -0,0 +1,296 @@
+<?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
+</root>
\ No newline at end of file
diff --git a/Wptscs/Properties/Settings.Designer.cs b/Wptscs/Properties/Settings.Designer.cs
new file mode 100644 (file)
index 0000000..db85bff
--- /dev/null
@@ -0,0 +1,275 @@
+//------------------------------------------------------------------------------\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
diff --git a/Wptscs/Properties/Settings.settings b/Wptscs/Properties/Settings.settings
new file mode 100644 (file)
index 0000000..27b08aa
--- /dev/null
@@ -0,0 +1,173 @@
+<?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
+</SettingsFile>
\ No newline at end of file
diff --git a/Wptscs/Readme.txt b/Wptscs/Readme.txt
new file mode 100644 (file)
index 0000000..63a1449
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Settings.cs b/Wptscs/Settings.cs
new file mode 100644 (file)
index 0000000..bc09f6c
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Utilities/FormUtils.cs b/Wptscs/Utilities/FormUtils.cs
new file mode 100644 (file)
index 0000000..ee364e7
--- /dev/null
@@ -0,0 +1,270 @@
+// ================================================================================================\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
diff --git a/Wptscs/Utilities/LazyXmlParser.cs b/Wptscs/Utilities/LazyXmlParser.cs
new file mode 100644 (file)
index 0000000..447a7a5
--- /dev/null
@@ -0,0 +1,617 @@
+// ================================================================================================\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
diff --git a/Wptscs/Utilities/ObjectUtils.cs b/Wptscs/Utilities/ObjectUtils.cs
new file mode 100644 (file)
index 0000000..4f10231
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Utilities/StringUtils.cs b/Wptscs/Utilities/StringUtils.cs
new file mode 100644 (file)
index 0000000..d449ae2
--- /dev/null
@@ -0,0 +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
diff --git a/Wptscs/Utilities/Validate.cs b/Wptscs/Utilities/Validate.cs
new file mode 100644 (file)
index 0000000..fb3176e
--- /dev/null
@@ -0,0 +1,134 @@
+// ================================================================================================\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
diff --git a/Wptscs/Utilities/XmlUtils.cs b/Wptscs/Utilities/XmlUtils.cs
new file mode 100644 (file)
index 0000000..2d2ba70
--- /dev/null
@@ -0,0 +1,103 @@
+// ================================================================================================\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
diff --git a/Wptscs/Wptscs.csproj b/Wptscs/Wptscs.csproj
new file mode 100644 (file)
index 0000000..b155a4d
--- /dev/null
@@ -0,0 +1,131 @@
+<?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
+</Project>
\ No newline at end of file
diff --git a/Wptscs/app.config b/Wptscs/app.config
new file mode 100644 (file)
index 0000000..0b9036f
--- /dev/null
@@ -0,0 +1,188 @@
+<?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
+</configuration>
\ No newline at end of file
diff --git a/Wptscs/config.xml b/Wptscs/config.xml
new file mode 100644 (file)
index 0000000..7c12ff3
--- /dev/null
@@ -0,0 +1,482 @@
+<?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
+</Config>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/.example.xml b/WptscsTest/Data/MediaWiki/en/.example.xml
new file mode 100644 (file)
index 0000000..d668d27
--- /dev/null
@@ -0,0 +1,104 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>.example</title>\r
+    <id>1239768</id>\r
+    <revision>\r
+      <id>359417281</id>\r
+      <timestamp>2010-05-01T10:10:23Z</timestamp>\r
+      <contributor>\r
+        <username>Luckas-bot</username>\r
+        <id>7320905</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>robot Adding: [[ru:.example]]</comment>\r
+      <text xml:space="preserve">{{Infobox Top level domain
+|name=example
+|background=#6CC
+|image=
+|introduced=1999
+|type=[[Top-level domain#Reserved TLDs|Reserved top-level domain]]
+|status=Reserved to prevent confusion and conflict
+|registry=[[Internet Assigned Number Authority|IANA]]
+|sponsor=None
+|intendeduse=Example top-level domain for documentation
+|actualuse=Sometimes used in intended manner in documentation
+|restrictions=no registrations are possible
+|structure=as needed in example usage
+|document=RFC 2606
+|disputepolicy=None
+|website=None
+|}}
+
+'''example''' is a name reserved by the [[Internet Engineering Task Force]] (IETF) in RFC 2606 (June 1999) that is not intended to be installed as a [[top-level domain]] in the global [[Domain Name System]] (DNS) of the [[Internet]].&lt;ref name="rfc"&gt;RFC 2606 (BCP 32), ''Reserved Top Level DNS Names'', D. Eastlake, A. Panitz, The Internet Society (June 1999)&lt;/ref&gt;
+
+Other reserved names are &lt;tt&gt;[[.test|test]]&lt;/tt&gt;, &lt;tt&gt;[[.invalid|invalid]]&lt;/tt&gt;, and &lt;tt&gt;[[.localhost|localhost]]&lt;/tt&gt;.
+
+The reasons for reservation of these top-level domain names is to reduce the likelihood of conflict and confusion.&lt;ref name="rfc" /&gt; This allows the use of these names for either documentation purposes or in local testing scenarios.
+
+The top-level domain &lt;tt&gt;example&lt;/tt&gt; is explicitly intended to be used in documentation or other technical writing where domain names are presented as examples in usage or presentation of concepts of the Domain Name System.
+
+==See also==
+* [[example.com]]
+* [[IPv4#Allocation|192.0.2.0/24]] – [[IPv4]] range reserved for documentation and example code by RFC 3330
+
+==References==
+{{reflist}}
+
+{| border="0" align="left"
+|-
+|{{GTLD}}
+|}&lt;!-- force GTLD to float with infobox --&gt;
+
+{{DEFAULTSORT:EXAMPLE}}
+
+[[Category:Top-level domains]]
+[[Category:Placeholder names]]
+
+[[ca:.example]]
+[[cs:.example]]
+[[da:.example]]
+[[eu:.example]]
+[[fr:.example]]
+[[it:.example]]
+[[hu:.example]]
+[[ja:トップレベルドメイン#特殊用途]]
+[[no:.example]]
+[[pl:.example]]
+[[ksh:.example]]
+[[ro:.example]]
+[[ru:.example]]
+[[sv:.example]]
+[[zh:.example]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Example (rapper).xml b/WptscsTest/Data/MediaWiki/en/Example (rapper).xml
new file mode 100644 (file)
index 0000000..343e419
--- /dev/null
@@ -0,0 +1,248 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Example (rapper)</title>\r
+    <id>9355587</id>\r
+    <revision>\r
+      <id>373598955</id>\r
+      <timestamp>2010-07-15T09:54:48Z</timestamp>\r
+      <contributor>\r
+        <username>Joe692</username>\r
+        <id>12734900</id>\r
+      </contributor>\r
+      <comment>Won't Go Quietly has charted at number 16 on the European Albums Chart.</comment>\r
+      <text xml:space="preserve">{{Infobox musical artist  &lt;!-- See Wikipedia:WikiProject Musicians --&gt;
+| Name                = Example
+| Img                 = ExampleSICK.jpg
+| Img_capt            = Example
+| Landscape           =
+| Background          = solo_singer
+| Birth_name          = Elliot John Gleave
+| Alias               = Example, example:/XMPL
+| Born                = {{Birth date and age|df=yes|1982|6|20}}
+| Died                =
+| Origin              = [[Fulham]], London, UK
+| Instrument          = [[Vocals]], [[Rapping]]
+| Genre               = [[British hip hop]], [[UK Garage]]
+| Occupation          = [[Vocalist]], [[Rapper]]
+| Years_active        = 2004–present
+| Label               = All the Chats (2004–2006)&lt;/br&gt; The Beats (2006–2007)&lt;/br&gt; [[Data Records|Data]] (2008–present)
+| Associated_acts     = Mr Rusher, Andy Sheldrake, [[Chase &amp; Status]], [[Hervé]], [[DJ Wire]], [[The Streets]], [[Hadouken!]], [[Don Diablo]], [[MJ Cole]] [[Lily Allen]]
+| URL                 = http://www.trythisforexample.com
+| Notable_instruments =
+}}
+
+'''Example''' (b. 20 June 1982 as '''Elliot John Gleave''') is a British [[singer]] and [[rapper]] currently signed to [[Data Records]]. His pseudonym arose due to his initials being '''e.g.''' which is a common abbreviation for [[E.g.#exempli_gratia|"for example"]].
+==Biography==
+Born 20 June 1982 at west [[London]] hospital in [[Hammersmith]], Gleave attended [[All Saints Primary School]] in [[Fulham]] High Street. He later went on to attend ADT College (now [[Ashcroft Technology Academy]]) in [[Wandsworth]], where he met his best friend and idol 'Fenners', . Gleave has claimed in interviews that the main reason he started rapping was due to his introduction to [[Hip-Hop]] through albums by [[Wu-Tang Clan]] and [[Snoop Dogg]] – the latter's album purchased primarily for "the cool cover art".  Aged 15, Example entered his first rap battle at a house party in [[Shepherds Bush]] and in his own words "completely destroyed a useless [[wanker]] and a fight broke out so [he] sprinted home" &lt;ref name="eo.uk"&gt;[http://www.exampleonline.co.uk :: Example :: Official Site&lt;!-- Bot generated title --&gt;]{{Dead link|date=June 2010}}&lt;/ref&gt;. In 1992, he won Royal Mail Poet of the Year, winning his school a new computer. In 2000, Example attended [[Royal Holloway University]], London to study film directing. While at University, Example started [[UK garage|garage]] [[MCing]] to make some money.  It was during this period that he met Joseph Gardner AKA Rusher, the producer who he would later go on to work with. Example and Rusher made a concept album in the audio booth of the University film department which included the track that would go onto be Example's first white-label vinyl release, "A Pointless Song".
+
+After graduating in 2003, Example moved to Australia for a year where he "did lots of landscape gardening, decorating and work on scaffolding". {{Citation needed|date=June 2010}}
+Example's sung vocals employ stylistic elements similar to that of 1970s [[Blues music]].{{Citation needed|date=June 2010}}
+
+In an interview with Sky Sports' show, [[Soccer AM]], Gleave proclaimed himself as a life long [[Fulham F.C.]] fan.
+
+==Career==
+===Early career and "What We Made" (2004–2007)===
+
+After moving back to London, Example decided to pursue a career in music. After releasing three singles through his own label "All The Chats", including the original 7" version of "I Dont Want To" in January 2006, Example received attention from [[Pete Tong]], [[Zane Lowe]] and others at [[BBC Radio 1|Radio 1]].  Example also caught the attention of people at four major record labels – perhaps most significantly [[The Streets|Mike Skinner]] (of The Streets), owner of The Beats label.
+
+After signing a deal in April 2006 with The Beats, Example put out a response to [[Lily Allen|Lily Allen's]] No.1 hit [[Smile (Lily Allen song)|"Smile"]] entitled "Vile" and received [[BBC Radio 1|Radio 1]] airplay from [[Zane Lowe]], [[Jo Whiley]] and [[Chris Moyles]]. His first 'proper' release on The Beats was "What We Made" in November 2006, the video for which was filmed in [[Chernobyl]], Ukraine (see [[#Film making|below]]).
+
+Example's second official Beats single entitled "You Can't Rap" was released in March 2007, followed by a re-release of "I Don't Want To" on 11 June 2007. "I Don't Want To" was followed by the single "So Many Roads" (famously sampling [[The Carpenters]] "We've Only Just Begun") which eventually turned out to be the opening track on Example's full-length studio debut. After the demise of The Beats label at the end of 2007 Example self-released his next single "Me + Mandy" on 10 March 2008 through his original imprint All The Chats. The video for "Me + Mandy" was shot over 4 days and nights in London, in over 30 locations with over 40 extras. Impressively all this was done at a cost of just £1000. It was directed by Example's friend Henry Scholfield who also made the promos for "Who Needs Sunshine?", "Vile", "You Can't Rap" and "I Don't Want To" and the video went on to win "Best Low-Budget Video" at the VMA's that year.
+
+In February 2008 Example also tried his hand at stand-up comedy as part of [[BBC2]]'s [[The Culture Show]]. Mentored by English comic [[Richard Herring]], Example spent six weeks writing and practicing his own stand-up routine which culminated in his first ever stand-up show in front of 60 paying customers in a [[Covent Garden]] pub. A week later he appeared on the bill under Richard Herring, [[Phill Jupitus]] and [[Harry Hill]] at the [[Lyric Hammersmith]] – interestingly Example had performed in the same venue ten years earlier whilst a student at ADT College. The full 13 minute routine can be found on youtube under the title "Example Does Standup"
+
+==="Won't Go Quietly" (2008–present)===
+
+Example has discussed evolving into a new genre in his blogs, describing his new work as "Dysfunctional Electro-Pop". UK producers [[Chase &amp; Status]], [[Calvin Harris]] and [[MJ Cole]] contribute also to the project.
+
+Example recently released the first single from the second album, called "[[Watch The Sun Come Up]]" through Data Records, which has proved to be moderately successful in the [[UK Singles Chart]], entering at #20 and in its second week of release rose to #19. The single spent a total of 4 weeks in the Top 40, proving to be one of Example's most successful singles to date..
+
+The second single from the album: [[Won't Go Quietly (song)|Won't Go Quietly]] was released on 18 January 2010. The chorus is sung by Sam James and Pearse MacIntyre of the band Rogues. "Won't Go Quietly" beat previous single: "Watch The Sun Come Up"'s peak of #19 by entering the [[UK Singles Chart]] at #6, of which it spent 2 weeks within the Top 10, marking Example's most successful single thus far.
+
+Rumours began to emerge in March 2010 that Example would be releasing the third single at some point during Summer 2010. It was confirmed in April 2010 that "Kickstarts" would be the third single from the album, and that Fenech Soler were doing one of various remixes for the single release.&lt;ref&gt;http://twitter.com/FENECHSOLER&lt;/ref&gt; The song, produced by [[Sub Focus]], received its first airplay on [[Zane Lowe]]s Radio 1 show on the 13th of April 2010. Described by Example as a mix of [[Snow Patrol]], [[MGMT]] and [[Dizzee Rascal]]. On the same show Example announced that the single would receive a June release with the album following ten days later. He also announced that there would be two more singles to follow. Kickstarts first charted on 20 June 2010 at #3. It has also been confirmed that "Last Ones Standing" and "Two Lives" will be forthcoming releases from the album.
+
+==Discography==
+===Albums===
+
+{|class="wikitable" style="text-align:center;"
+!rowspan="2"| Year
+!rowspan="2" width="230"| Album details
+!colspan="3"| Peak Chart Positions
+|- 
+!style="width:4em;font-size:70%;"|[[UK Albums Chart|UK]]
+!style="width:4em;font-size:70%;"|[[Irish Albums Chart|IRE]]
+!style="width:4em;font-size:70%;"|[[European Top 100 Albums|EU]]
+|-
+|2007
+|align="left"| '''''[[What We Made]]'''''
+*Released: 17 September 2007
+*Label: The Beats
+*Formats: [[Compact Disc|CD]], [[music download|Digital Download]]
+| &amp;ndash;
+| &amp;ndash;
+| &amp;ndash;
+|-
+|2010
+|align="left"| '''''[[Won't Go Quietly]]'''''
+*Released: 21 June 2010
+*Label: [[Data Records]]
+*Formats: [[Compact Disc|CD]], [[music download|Digital Download]]
+| 4
+| 31
+| 16
+|-
+|}
+
+===Mixtapes===
+* ''[[We Didn't Invent the Remix]]'' (2006)
+* ''What We Almost Made'' (2008)
+* ''The Credit Munch'' (2009)
+* ''The Big Dog Blog Mix'' [with Wire] (2010)
+
+===Singles===
+{| class="wikitable"
+! rowspan="2"| Year
+! rowspan="2"| Single
+! colspan="5"| Chart Positions &lt;ref&gt;[http://www.zobbel.de/cluk/CLUK2007.HTM Chart Log UK - Chart Coverage and Record Sales 2007]&lt;/ref&gt;
+! rowspan="2"| Album
+|-
+!width=45| &lt;small&gt;[[UK Singles Chart|UK]]&lt;/small&gt;
+!width=45| &lt;small&gt;[[UK Dance Chart|UK&lt;br&gt;DAN]]&lt;/small&gt;
+!width=45| &lt;small&gt;[[French Singles Chart|FRA]]&lt;/small&gt;
+!width=45| &lt;small&gt;[[Irish Singles Chart|IRE]]&lt;/small&gt;
+!width=45| &lt;small&gt;[[European Hot 100|EU]]&lt;/small&gt;
+|-
+| align="center"| 2006
+| "What We Made"
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| rowspan="5"| ''[[What We Made]]''
+|-
+| align="center" rowspan="4"| 2007
+| "Posh Boys Forever!"
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+|-
+| "Girthy Grosso"
+| align="center"|167
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+|-
+| "8 Inch Fen"
+| align="center"|196
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+|-
+| "Me &amp; Mandy"
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+|-
+|2009
+| "[[Watch the Sun Come Up]]"
+| align="center"| 19
+| align="center"| 3
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| align="center"|&amp;mdash;
+| rowspan="3"| ''[[Won't Go Quietly]]''
+|-
+| align="center" rowspan="2"| 2010
+| "[[Won't Go Quietly (song)|Won't Go Quietly]]"
+| align="center"| 6
+| align="center"| 1
+| align="center"| 11
+| align="center"| 36
+| align="center"|&amp;mdash;
+|-
+| "[[Kickstarts (song)|Kickstarts]]"
+| align="center"|3
+| align="center"|1
+| align="center"|&amp;mdash;
+| align="center"|8
+| align="center"|11
+|-
+|}
+
+===Other singles===
+{| class="wikitable"
+!  Year
+!  Single
+!  Album
+|-
+| 2009
+| "Hooligans" &lt;small&gt;(with [[Don Diablo]])&lt;/small&gt;
+| ''[[Won't Go Quietly]]''
+|-
+|}
+
+==Film making==
+Whilst filming a promo video for his track "What We Made" in the abandoned city of [[Chernobyl]] in northern [[Ukraine]], Example also filmed an 18-minute documentary in the ghost towns he visited and their deserted schools, hotels and funfairs, many of which still remain exactly as they were when they were abandoned after the infamous disaster 20 years ago. "I don't think anyone who's been here can be for nuclear power," he said, looking around at empty cots and babies' gas masks in a disintegrating schoolroom near Chernobyl. "I've read stuff recently about how we're only ever going to survive if we make nuclear power available, but you just think: why would you want it to happen after seeing this?"&lt;ref&gt;[http://www.greenpeace.org.uk/blog/nuclear/what-we-made-a-nuclear-wasteland What we made: a nuclear wasteland | Greenpeace UK&lt;!-- Bot generated title --&gt;]&lt;/ref&gt;
+
+== References ==
+{{Reflist}}
+
+== External links ==
+* [http://www.trythisforexample.com/ Example official website]
+* {{MySpace-music|leadingbyexample|Example}}
+* [http://www.greenpeace.org.uk/MultimediaFiles/Live/Video/7970.wmv Chernobyl Documentary (Windows Media)]
+* [http://www.greenpeace.org.uk/MultimediaFiles/Live/Video/7969.mov Chernobyl Documentary (Quicktime)]
+* [http://www.mtv.co.uk/channel/mtvuk/25052007/example_interview Example MTV Interview]
+
+{{Example (Rapper)}}
+
+{{use dmy dates}}
+
+{{DEFAULTSORT:Examplle}}
+[[Category:1982 births]]
+[[Category:English rappers]]
+[[Category:Living people]]
+[[Category:Alumni of Royal Holloway, University of London]]
+
+[[de:Example]]
+[[fr:Example (rappeur)]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Exemplar.xml b/WptscsTest/Data/MediaWiki/en/Exemplar.xml
new file mode 100644 (file)
index 0000000..6e69159
--- /dev/null
@@ -0,0 +1,71 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Exemplar</title>\r
+    <id>1691470</id>\r
+    <revision>\r
+      <id>367275228</id>\r
+      <timestamp>2010-06-10T20:06:31Z</timestamp>\r
+      <contributor>\r
+        <username>Michael Hardy</username>\r
+        <id>4626</id>\r
+      </contributor>\r
+      <comment>grammar: "The solution become well known" ---&gt; "The solutions become well known"</comment>\r
+      <text xml:space="preserve">{{Wiktionary|exemplar}}
+:''"Exemplars" directs here. For the superpowered comic book team, see [[Exemplars (comics)]].''{{for|the ship|SS Exemplar}}
+'''Exemplar,''' in the sense developed by [[philosophy of science|philosopher of science]] [[Thomas Samuel Kuhn|Thomas Kuhn]], is a well known usage of a [[Scientific theories|scientific theory]].   
+
+According to Kuhn, scientific practice alternates between periods of [[normal science]] and extraordinary/revolutionary science. During periods of normalcy, scientists tend to subscribe to a large body of interconnecting knowledge, methods, and assumptions which make up the reigning [[paradigm]] (see [[paradigm shift]] for more information on Kuhn's model). Normal science presents a series of "puzzles" that are solved as scientists explore their field.  The solutions to some of these puzzles become well known and are the '''exemplars''' of the field.
+
+Kuhn introduced the concept of exemplar in a postscript to the second edition of ''[[The Structure of Scientific Revolutions]]'' (1970). He noted that
+:[b]ecause the term &lt;nowiki&gt;[&lt;/nowiki&gt;paradigm&lt;nowiki&gt;]&lt;/nowiki&gt; has assumed a life of its own ... I shall here substitute ‘exemplars.’ By it I mean, initially, the concrete problem-solutions that students encounter from the start of their scientific education, whether in laboratories, on examinations, or at the ends of chapters in science texts. ... All physicists, for example, begin by learning the same exemplars: problems such as the [[inclined plane]], the conical [[pendulum]], and [[Kepler's laws of planetary motion|Keplerian orbits]]; instruments such as the [[vernier scale|vernier]], the [[calorimeter]], and the [[Wheatstone bridge]].
+
+Those who study a scientific discipline are expected to know its exemplars.  There is no fixed set of exemplars, but for a physicist today it would certainly include such things as the [[harmonic oscillator]] from [[mechanics]] and the [[hydrogen atom]] from [[quantum mechanics]].  For a biologist today the set includes the population variations of the [[Peppered moth|European peppered moth]] (''Biston betularia'') and the [[convergent evolution]] of wings. They should also be familiar with ideas which have been discredited or otherwise proven false.
+
+==See also==
+*[[Paradigm]]
+*[[Paradigm shift]]
+*[[Scientific consensus]]
+*[[Theories and sociology of the history of science]]
+
+==References==
+*{{cite book | author=Thomas S. Kuhn | title=The Structure of Scientific Revolutions | publisher= (2nd edn.) University of Chicago Press | year=1970 | isbn=0-226-45804-0}}
+
+[[Category:Philosophy of science]]
+[[Category:Historiography of science]]
+
+[[et:Eksemplar]]
+[[lt:Egzempliorius]]
+[[pt:Exemplo]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Exemplum.xml b/WptscsTest/Data/MediaWiki/en/Exemplum.xml
new file mode 100644 (file)
index 0000000..0230450
--- /dev/null
@@ -0,0 +1,149 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Exemplum</title>\r
+    <id>2474747</id>\r
+    <revision>\r
+      <id>369991912</id>\r
+      <timestamp>2010-06-24T22:25:40Z</timestamp>\r
+      <contributor>\r
+        <username>GoingBatty</username>\r
+        <id>11555324</id>\r
+      </contributor>\r
+      <comment>Fixing [[Wikipedia:Disambiguation pages with links|links to disambiguation pages]] and other clean up using [[Project:AWB|AWB]]</comment>\r
+      <text xml:space="preserve">An '''exemplum''' (Latin for "example", pl. '''exempla''',  ''exempli gratia'' = "for example", abbr.: ''e.g.'') is a moral [[anecdote]], brief or extended, real or fictitious, used to illustrate a point.
+
+==Exemplary literature==
+
+This [[genre]] sprang from the above, in classical, medieval and Renaissance literature, consisting of lives of famous figures, and using these (by emphasizing good or bad character traits) to make a moral point.
+
+Collections of Exempla helped [[Middle Ages|medieval]] preachers to adorn their [[sermon]]s, to emphasize moral conclusions or illustrate a point of doctrine. The subject matter could be taken from [[fable]]s, [[folktale]]s, [[legend]]s or real history. [[Jacques de Vitry]]'s book of exempla, c. 1200, was one of the most famous collections. [[Geoffrey Chaucer]]'s ''[[The Miller's Prologue and Tale]]'' became a vivid satire on these collections and the abuse they found wherever they were just brought into monotonous [[litany|litanies]].
+
+Examples include:
+
+*[[Suetonius|Suetonius's]] ''De vita Caesarum'' or ''[[Lives of the Twelve Caesars]]''
+*[[Plutarch|Plutarch's]] ''[[Parallel Lives]]''
+*[[Jerome|Jerome's]] ''[[De Viris Illustribus (Jerome)|De viris illustribus]]''
+*[[Petrarch|Petrarch's]] ''[[De Viris Illustribus (Petrarch)|De viris illustribus]]''
+*[[Chaucer|Chaucer's]] ''[[The Monk's Prologue and Tale]]'', ''[[The Pardoner's Tale]]'' and ''[[The Legend of Good Women]]''
+*[[Boccacio|Boccacio's]] ''[[On Famous Women]]'' and ''[[De Casibus Virorum Illustrium|On the Fates of Illustrious Men]]''
+*[[Christine de Pizan|Christine de Pizan's]] ''[[The Book of the City of Ladies]]''.
+*[[Don Juan Manuel]]'s ''[[Libro de los ejemplos del conde Lucanor y de Patronio]].
+*''[[Mirror for Magistrates]]'' by various Tudor authors
+*[[Der Stricker]]'s ''bispel''
+
+==Three examples of exempla==
+
+''The Norton Anthology of Western Literature'' includes three exempla (singular, ''exemplum''), stories that illustrate a general principle or underscore a moral lesson: “The Two City Dwellers and the Country Man” and “The King’s Tailor’s Apprentice” (both from ''The Scholar’s Guide'') and “The Cursed Dancers of Colbeck.” 
+
+“[[The Pardoner’s Tale]]” in Chaucer’s ''The Canterbury Tales'' is a longer example of an exemplum.
+
+A [[father]] tells the first [[narrative|story]] from ''The Scholar’s Guide'', and his [[son]] tells the second.
+
+==="The Two City Dwellers and the Country Man"===
+
+In “The Two City Dwellers and the Country Man,” told by the father, the three traveling companions of the tale’s [[title]] are on a [[pilgrimage]] to [[Mecca]]. Near their destination, their provisions are nearly depleted, and the two [[city]] dwellers attempt to cheat the [[country]] [[man]] by telling him that whoever of them dreams the most extraordinary [[dream]] shall get the last of their [[bread]].
+
+As the city dwellers [[sleep]], the country man, alert to their intended deception, eats the half-baked bread before retiring.
+
+The city dwellers relate their made-up dreams. One says he was taken to [[heaven]] and led before [[God]] by angels. The other says that angels escorted him to [[hell]]. 
+
+The country man says he dreamed the same things that his companions dreamed and, believing them to be forever lost, one to heaven and the other to hell, ate the bread.
+
+The son tells his father the moral of the story: “As it says in the [[proverb]], ‘He who wanted all, lost all.’” He says that the two city dwellers got their just comeuppance. The story says that he wishes they’d been whipped, as the antagonist in another story he has heard, was beaten for his chicanery. His comment is a transition to the next tale, causing the father to ask his son to tell him this story. Thus, the roles of the father and his son are reversed, as the father, who was the storyteller, becomes the listener, and the son, who was his father’s audience, becomes the narrator.
+
+==="The King And His Wife"===
+
+The son’s story recounts the story of a king’s tailor’s assistant, a youth by the name of Nedui.
+
+One day while he is away, his master gives the other apprentices bread and [[honey]], but does not save any for Nedui, telling them that Nedui “would not eat honey even if he were here.” Upon learning that he has been left out, Nedui avenges himself upon his master by telling the [[eunuch]] whom the king has set over the apprentices as their [[supervisor]] that the [[tailor]] is subject to seizures of [[Insanity|madness]], during which he becomes violent and dangerous. In fact, Nedui claims, he has killed those who have happened to be near him when he is in the grip of such a fit. To protect himself, Nedui says, he binds and beats the tailor when such a fit comes over him. He also tells the eunuch what to look for: “When you see him looking all around and feeling the [[floor]] with his hands and getting up from his seat and picking up the [[chair]] on which he is seated, then you will know that he is mad, and if you do not protect yourself and your servants, he will beat you on the head with a [[club]].”
+
+The next day, Nedui hides the tailor’s shears, and, when the master, hunting for them,  behaves as Nedui mentioned to the eunuch, the eunuch orders his servants to bind the tailor and beats him himself with a club. His servants also beat him until he is unconscious and “half dead.”
+
+When he regains consciousness, the tailor asks the eunuch what [[crime]] he has committed to have deserved such a beating, and the eunuch tells him what Nedui told him about the tailor’s seizures. “Friend, when have you ever seen me crazy?” the master asks his apprentice, to which question he receives, from Nedui, the rejoinder: “When have you ever seen me refuse to eat honey?”
+
+The father tells the son the [[moral]] of the story: “The tailor deserved his punishment because if he had kept the precept of Moses, to love his brother as himself, this would not have happened to him.”
+
+By having the listener tell the narrator the moral of the story, the storyteller shows that the narrative has successfully served its purpose as an exemplum, as the listener, hearing the story, shows that he is able to ascertain the moral that the tale is intended to express.
+
+===“The Cursed Dancers of Colbeck"===
+
+The third exemplum, “The Cursed Dancers of Colbeck,” is a prose, rather than a poetic, narrative. Like a mini-sermon, it preaches against wrong conduct—in this case, sacrilegious behavior. This tale has an identifiable author, Robert Mannyng,” who set down the story in the early fourteenth century. ''The Norton Anthology''’s version is translated from [[Middle English]] by Lee Patterson.
+
+To bolster his listener’s [[belief]] that “most of” his tale is “the [[gospel]] [[truth]],” the narrator names the names of the culprits and their victims (both themselves and others) and cites no less an authority than [[Pope Leo]] as one who knows and wrote a version of the narrative and points out that the story is “known in the court at [[Rome]]” and has appeared widely in many chronicles, including those “beyond the [[sea]].” However, after the telling of the tale, the storyteller admits that some doubt its veracity.
+
+The story starts by identifying several activities that are not allowed in [[Church (building)|church]] or in the [[churchyard]]: “carols, [[wrestling]], or summer games.” In addition, “interludes or [[singing]], beating the [[tabor (instrument)|tabor]] [a small drum], or piping. . . . while the [[priest]] is conducting [[mass]]” are “forbidden” and sacrilegious, and “good priests” will not tolerate them.
+
+It is also improper to dance in church, as the story that the narrator is about to tell demonstrates.
+
+When “twelve fools” in Colbeck (or, as the editors’ note explains, “[[Kolbigk]], in [[Saxony]], an area in eastern [[Germany]], just north of the present-day Czech [[border]]) decided, one [[Christmas]] Eve, to make “a [[Carol (music)|carol]]--madly, as a kind of challenge,” and persisted in singing and dancing in the churchyard while the priest was trying to conduct Mass, despite his entreaties to them to stop, the priest calls upon God to [[curse]] them.
+
+The singers’ carol contains three lines, the last of which appears to become the basis of their curse, as they are unable to leave the churchyard or to quit singing or dancing for a year after God curses them for their sacrilegious behavior:
+
+:By the leafy wood rode Bovoline,
+:With him he led the fair Mersewine.
+:Why are we waiting? Why don’t we go?
+
+As a result of the curse, the dancers cannot stop singing and dancing; neither can they let go of one another’s hands.
+
+The priest, too late, sends his son, Ayone, to rescue his daughter, Ave, who is one of the “twelve fools” involved in the dancing. However, due to the curse, when Ayone takes his sister’s [[arm]] to separate her from the other carolers, it detaches from her [[body]]. Miraculously, her [[wound]] does not bleed, nor does she die from it.
+
+Ayone takes the arm to his father. The priest tries, three times unsuccessfully, to bury the limb, but the [[grave (burial)|grave]] casts it back, so the priest displays it inside the church. Everyone, including the [[emperor]], comes to see the cursed dancers, who, despite no rest, [[food]], [[drink]], or sleep, dance non-stop, [[night]] and [[day]], regardless of the [[temperature]] or the [[weather]]. Several times, the emperor orders a covering to be built to protect the dancers from storms, but it is reduced to rubble overnight each time it is built or rebuilt.
+
+After the [[year]] has ended, the curse is lifted, and the dancers fall down upon the ground, as if dead.  Three days later, they arise—except for Ave, who has died. Soon after, the priest also dies. The emperor installs the container in the church as a receptacle for the dead girl’s arm, and it becomes a holy [[relic]] commemorating the [[miracle]] of the curse.
+
+The other dancers cannot get together again, ever, and must skip, instead of walking, wherever they go. Living mementoes of God’s curse against sacrilegious [[behavior]], they bear permanent physical changes to their [[clothing]] and their bodies: “Their clothes didn’t rot nor their nails grow; their [[hair]] didn’t lengthen nor their [[complexion]] change. Nor did they ever have [[relief]]. . . .”
+
+Although some believe and others doubt the authenticity of the tale he’s told, the narrator says he recounted the story so that his listeners, taking heed, may be “afraid to carol in a church or churchyard, especially against the priest’s will,” as “jangling is a form of [[sacrilege]].”
+
+==Bibliography==
+
+*''The Norton Anthology of Western Literature'', Volume I. Sarah Lawall (Gen. Ed.). New York: W. W. Norton &amp; Company, 2006.
+
+[[Category:Wisdom literature]]
+[[Category:History of literature]]
+
+[[ca:Exemplum]]
+[[cs:Exemplum]]
+[[es:Exemplum]]
+[[fr:Exemplum]]
+[[it:Exemplum]]
+[[no:Exemplum]]
+[[pl:Exemplum]]
+[[ru:Exempla]]
+[[simple:Example]]
+[[sk:Exemplum]]
+[[sv:Exemplum]]
+[[uk:Екземплум]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Nothing Page.xml b/WptscsTest/Data/MediaWiki/en/Nothing Page.xml
new file mode 100644 (file)
index 0000000..748c2ae
--- /dev/null
@@ -0,0 +1,32 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>
+    <generator>MediaWiki 1.17wmf1</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal talk</namespace>
+      <namespace key="108" case="first-letter">Book</namespace>
+      <namespace key="109" case="first-letter">Book talk</namespace>
+    </namespaces>
+  </siteinfo>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/en/Template_disambig.xml b/WptscsTest/Data/MediaWiki/en/Template_disambig.xml
new file mode 100644 (file)
index 0000000..49409fc
--- /dev/null
@@ -0,0 +1,59 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Disambig</title>\r
+    <id>9950598</id>\r
+    <revision>\r
+      <id>342744507</id>\r
+      <timestamp>2010-02-08T18:22:15Z</timestamp>\r
+      <contributor>\r
+        <username>Davidgothberg</username>\r
+        <id>109101</id>\r
+      </contributor>\r
+      <comment>Forwarding "nocat" to {{dmbox}} so "nocat=true" can be used to suppress categorisation when just demonstrating or testing this template.</comment>\r
+      <text xml:space="preserve">{{dmbox
+| type = disambig
+| text = 
+This [[Help:Disambiguation|disambiguation]] page lists articles associated with the same title. &lt;br /&gt; &lt;small&gt;If an [{{fullurl:Special:WhatLinksHere/{{{page-title|{{FULLPAGENAME}}}}}|namespace=0}} internal link] led you here, you may wish to change the link to point directly to the intended article.&lt;/small&gt;
+| nocat = {{{nocat|}}}   &lt;!--So "nocat=true" works--&gt;
+}}{{main other
+| demospace = {{{demospace|}}}
+| [[Category:Disambiguation pages]]{{disambig/cat|{{{1|}}}}}{{disambig/cat|{{{2|}}}}}{{disambig/cat|{{{3|}}}}}{{disambig/cat|{{{4|}}}}}{{disambig/cat|{{{5|}}}}}{{disambig/cat|{{{6|}}}}}{{disambig/cat|{{{7|}}}}}{{disambig/cat|{{{8|}}}}}{{disambig/cat|{{{9|}}}}}{{disambig/cat|{{{10|}}}}}
+| &lt;!-- Don't categorise when not in main (article) space. --&gt;
+}}&lt;noinclude&gt;
+
+{{documentation}}
+&lt;!-- Add categories and interwikis to the /doc subpage, not here! --&gt;
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Template_wikiquote.xml b/WptscsTest/Data/MediaWiki/en/Template_wikiquote.xml
new file mode 100644 (file)
index 0000000..ba95351
--- /dev/null
@@ -0,0 +1,53 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Wikiquote</title>\r
+    <id>958937</id>\r
+    <restrictions>move=sysop:edit=sysop</restrictions>\r
+    <revision>\r
+      <id>364005072</id>\r
+      <timestamp>2010-05-24T22:08:40Z</timestamp>\r
+      <contributor>\r
+        <username>Plastikspork</username>\r
+        <id>5075409</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>Per edit request on talk page</comment>\r
+      <text xml:space="preserve">{{sister
+|project=wikiquote
+|text=[[Wikiquote]] has a collection of quotations related to: '''''{{sec link auto|q|{{{1|Special:Search/{{PAGENAME}}}}}|{{{2|{{{1|{{PAGENAME}}}}}}}}}}''''' 
+}}&lt;noinclude&gt;
+{{documentation}}
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/Template_wiktionary.xml b/WptscsTest/Data/MediaWiki/en/Template_wiktionary.xml
new file mode 100644 (file)
index 0000000..1b66b7a
--- /dev/null
@@ -0,0 +1,70 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>
+    <generator>MediaWiki 1.17wmf1</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal talk</namespace>
+      <namespace key="108" case="first-letter">Book</namespace>
+      <namespace key="109" case="first-letter">Book talk</namespace>
+    </namespaces>
+  </siteinfo>
+  <page>
+    <title>Template:Wiktionary</title>
+    <id>960068</id>
+    <restrictions>edit=sysop:move=sysop</restrictions>
+    <revision>
+      <id>364078764</id>
+      <timestamp>2010-05-25T08:33:58Z</timestamp>
+      <contributor>
+        <username>Plastikspork</username>
+        <id>5075409</id>
+      </contributor>
+      <minor/>
+      <comment>Per edit request</comment>
+      <text xml:space="preserve" bytes="661">{{sister
+|project=wiktionary
+|text=Look up '''''{{sec link auto|wiktionary|{{{1|Special:Search/{{lc:{{SUBPAGENAME}}}}}}}|{{{1|{{lc:{{SUBPAGENAME}}}}}}}}}'''''{{#if:{{{2|}}}
+  |{{#if:{{{3|}}}
+   |,
+   |&amp;nbsp;or
+  }} '''''{{sec link auto|wiktionary|{{{2}}}|{{{2}}}}}'''''
+ }}{{#if:{{{3|}}}
+  |{{#if:{{{4|}}}
+   |,
+   |, or
+  }} '''''{{sec link auto|wiktionary|{{{3}}}|{{{3}}}}}'''''
+ }}{{#if:{{{4|}}}
+  |{{#if:{{{5|}}}
+   |,
+   |, or
+  }} '''''{{sec link auto|wiktionary|{{{4}}}|{{{4}}}}}'''''
+ }}{{#if:{{{5|}}}
+  |, or '''''{{sec link auto|wiktionary|{{{5}}}|{{{5}}}}}'''''
+ }} in [[Wiktionary]], the free dictionary.
+}}&lt;noinclude&gt;
+{{documentation}}
+&lt;/noinclude&gt;</text>
+    </revision>
+  </page>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/en/_api.xml b/WptscsTest/Data/MediaWiki/en/_api.xml
new file mode 100644 (file)
index 0000000..6cfd1cc
--- /dev/null
@@ -0,0 +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
+</api>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/example.com.xml b/WptscsTest/Data/MediaWiki/en/example.com.xml
new file mode 100644 (file)
index 0000000..eb05297
--- /dev/null
@@ -0,0 +1,89 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Example.com</title>\r
+    <id>1191806</id>\r
+    <revision>\r
+      <id>370265247</id>\r
+      <timestamp>2010-06-26T15:50:17Z</timestamp>\r
+      <contributor>\r
+        <username>Mindmatrix</username>\r
+        <id>160367</id>\r
+      </contributor>\r
+      <comment>links and other tweaks</comment>\r
+      <text xml:space="preserve">__NOTOC__
+[[Image:Examplewebsite.PNG|thumb|200px|right|The web page served for example.com, example.net and example.org]]
+'''example.com''', '''example.net''', and '''example.org''' are [[Second-level domain|second-level]] [[domain name]]s reserved by the [[Internet Engineering Task Force]] through RFC 2606, Section 3,&lt;ref&gt;RFC 2606, ''Reserved Top Level DNS Names'', D. Eastlake, A. Panitz, The [[Internet Society]] (June 1999)&lt;/ref&gt; for use in documentation and examples. They are not available for registration.
+
+By implementing the reservation, the [[Internet Assigned Numbers Authority]] (IANA) made available domains to use in [[technical documentation|technical]] and [[software documentation]], [[manual]]s and sample software configurations. Thus, [[Technical writer |documentation writers]] can be sure to select a domain name without creating naming conflicts if end-users try to use the sample configurations or examples verbatim.
+
+When an address such as "username@example.com" is used to demonstrate the sign-up process on a website, it indicates to the user they should fill in an actual [[e-mail address]] at which they receive mail. "example.com" is used in a generic and vendor-neutral manner.
+
+These domain names resolve to a server managed by [[ICANN]].
+
+==Subdomains==
+The example domains have one subdomain name defined in the [[Domain Name System]]. For each domain, the &lt;tt&gt;www&lt;/tt&gt; [[third-level domain]] name resolves to functioning web sites hosted at the same [[IP address]] as the corresponding [[second-level domain]] name.
+
+==See also==
+* [[.example]] Top-level domain name reserved for documentation purposes
+* [[Fictitious domain name]]
+* [[IPv4#Allocation]]&amp;nbsp;– [[IPv4]] address ranges reserved for documentation and examples
+* [[Top-level domain#Reserved domains|Reserved top-level domains]]
+
+==References==
+{{reflist}}
+
+==External links==
+*[http://example.com example.com]
+*[http://example.net example.net]
+*[http://example.org example.org]
+
+[[Category:Domain name system]]
+[[Category:Placeholder names]]
+
+[[bcl:Example.com]]
+[[ca:Example.com]]
+[[ceb:Example.com]]
+[[cbk-zam:Example.com]]
+[[es:Example.com]]
+[[fr:Example.com]]
+[[is:Example.net]]
+[[it:Example.com]]
+[[ja:Example.com]]
+[[ksh:.example.com]]
+[[ru:Домены для примеров]]
+[[fi:Example.com]]
+[[tl:Example.com]]
+[[zh:Example.com]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/example.net.xml b/WptscsTest/Data/MediaWiki/en/example.net.xml
new file mode 100644 (file)
index 0000000..0c656c6
--- /dev/null
@@ -0,0 +1,49 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Example.net</title>\r
+    <id>1191809</id>\r
+    <redirect />\r
+    <revision>\r
+      <id>276399003</id>\r
+      <timestamp>2009-03-10T23:55:30Z</timestamp>\r
+      <contributor>\r
+        <username>Mindmatrix</username>\r
+        <id>160367</id>\r
+      </contributor>\r
+      <comment>add [[Category:Placeholder names]]</comment>\r
+      <text xml:space="preserve">#redirect [[Example.com]]
+
+[[Category:Placeholder names]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/example.org.xml b/WptscsTest/Data/MediaWiki/en/example.org.xml
new file mode 100644 (file)
index 0000000..523feb0
--- /dev/null
@@ -0,0 +1,49 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Example.org</title>\r
+    <id>1191808</id>\r
+    <redirect />\r
+    <revision>\r
+      <id>276398987</id>\r
+      <timestamp>2009-03-10T23:55:22Z</timestamp>\r
+      <contributor>\r
+        <username>Mindmatrix</username>\r
+        <id>160367</id>\r
+      </contributor>\r
+      <comment>add [[Category:Placeholder names]]</comment>\r
+      <text xml:space="preserve">#REDIRECT [[Example.com]]
+
+[[Category:Placeholder names]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/en/example.xml b/WptscsTest/Data/MediaWiki/en/example.xml
new file mode 100644 (file)
index 0000000..028a2ac
--- /dev/null
@@ -0,0 +1,62 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://en.wikipedia.org/wiki/Main_Page</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">Media</namespace>\r
+      <namespace key="-1" case="first-letter">Special</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">Talk</namespace>\r
+      <namespace key="2" case="first-letter">User</namespace>\r
+      <namespace key="3" case="first-letter">User talk</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia talk</namespace>\r
+      <namespace key="6" case="first-letter">File</namespace>\r
+      <namespace key="7" case="first-letter">File talk</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template talk</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help talk</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category talk</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal talk</namespace>\r
+      <namespace key="108" case="first-letter">Book</namespace>\r
+      <namespace key="109" case="first-letter">Book talk</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Example</title>\r
+    <id>1646233</id>\r
+    <revision>\r
+      <id>373175932</id>\r
+      <timestamp>2010-07-13T00:49:18Z</timestamp>\r
+      <contributor>\r
+        <username>Joshua Scott</username>\r
+        <id>819997</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>cleanup</comment>\r
+      <text xml:space="preserve">[[File:Example.png|thumb|Wikipedia's example image. (Example.png)]]
+{{wiktionary}}
+{{wikiquote}}
+'''Example''' may refer to:
+
+*[[Example (rapper)]], a British rapper
+*[[example.com]], [[example.net]], [[example.org]]  and [[.example]], domain names reserved for use in documentation as examples 
+
+==See also==
+*[[Exemplum]], medieval collections of short stories to be told in sermons
+*[[Exemplar]], a prototype or model which others can use to understand a topic better
+
+{{disambig}}
+
+[[fr:Example]]
+[[ksh:Example (Watt ėßß datt?)]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Category_宇宙船.xml b/WptscsTest/Data/MediaWiki/ja/Category_宇宙船.xml
new file mode 100644 (file)
index 0000000..d2a53f7
--- /dev/null
@@ -0,0 +1,63 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Category:宇宙船</title>\r
+    <id>107732</id>\r
+    <revision>\r
+      <id>28928957</id>\r
+      <timestamp>2009-11-10T06:10:00Z</timestamp>\r
+      <contributor>\r
+        <username>Cncs wikipedia</username>\r
+        <id>39568</id>\r
+      </contributor>\r
+      <minor />\r
+      <text xml:space="preserve">{{Commons cat|Manned spacecraft|有人宇宙船}}
+[[宇宙船]](有人)に関するカテゴリ。
+
+{{DEFAULTSORT:うちゆうせん}}
+[[Category:有人宇宙飛行]]
+[[Category:宇宙機]]
+
+[[bg:Категория:Космически кораби]]
+[[en:Category:Manned spacecraft]]
+[[fa:رده:فضاپیمای سرنشین دار]]
+[[fr:Catégorie:Engin spatial habité]]
+[[id:Kategori:Wahana antariksa berawak]]
+[[ko:분류:유인 우주선]]
+[[lv:Kategorija:Kosmosa kuģi]]
+[[ro:Categorie:Nave spaţiale pilotate]]
+[[ru:Категория:Пилотируемые КА]]
+[[si:ප්‍රවර්ගය:මිනිසුන් සහිත අභ්‍යවකාශ යානා]]
+[[zh:Category:航天飞行器]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_En icon.xml b/WptscsTest/Data/MediaWiki/ja/Template_En icon.xml
new file mode 100644 (file)
index 0000000..41b253e
--- /dev/null
@@ -0,0 +1,90 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:En icon</title>\r
+    <id>764402</id>\r
+    <revision>\r
+      <id>29520301</id>\r
+      <timestamp>2009-12-15T14:51:15Z</timestamp>\r
+      <contributor>\r
+        <username>JAnDbot</username>\r
+        <id>66507</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: bar, eo, se, uk 除去: es 変更: hr, tr</comment>\r
+      <text xml:space="preserve">{{Languageicon|en|英語}}&lt;noinclude&gt;
+[[Category:言語アイコン|en]]
+
+&lt;!--interwiki--&gt;
+[[bar:Vorlage:EnS]]
+[[bs:Šablon:En simbol]]
+[[ca:Plantilla:En]]
+[[cs:Šablona:En]]
+[[cy:Nodyn:Eicon en]]
+[[da:Skabelon:En sprog]]
+[[el:Πρότυπο:En]]
+[[en:Template:En icon]]
+[[eo:Ŝablono:Lang-en]]
+[[eu:Txantiloi:En]]
+[[fi:Malline:En]]
+[[fr:Modèle:En]]
+[[gl:Modelo:En]]
+[[hi:साँचा:En]]
+[[hr:Predložak:Eng icon]]
+[[hu:Sablon:En]]
+[[ia:Patrono:En]]
+[[id:Templat:En]]
+[[it:Template:En]]
+[[lb:Schabloun:En]]
+[[li:Sjabloon:En]]
+[[mk:Шаблон:En]]
+[[ms:Templat:En icon]]
+[[nl:Sjabloon:En]]
+[[pt:Predefinição:((en))]]
+[[ro:Format:En icon]]
+[[ru:Шаблон:Ref-en]]
+[[se:Template:En]]
+[[sh:Šablon:En icon]]
+[[sk:Šablóna:Eng icon]]
+[[sl:Predloga:Ikona en]]
+[[sr:Шаблон:En]]
+[[sv:Mall:En ikon]]
+[[tl:Suleras:En icon]]
+[[tr:Şablon:En icon]]
+[[uk:Шаблон:Lang-en]]
+[[vi:Bản mẫu:En icon]]
+[[zh:Template:En icon]]
+[[zh-classical:Template:En]]
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_Infobox 航空機.xml b/WptscsTest/Data/MediaWiki/ja/Template_Infobox 航空機.xml
new file mode 100644 (file)
index 0000000..5292b51
--- /dev/null
@@ -0,0 +1,70 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Infobox 航空機</title>\r
+    <id>667140</id>\r
+    <revision>\r
+      <id>24423117</id>\r
+      <timestamp>2009-02-16T08:55:10Z</timestamp>\r
+      <contributor>\r
+        <username>ButuCC</username>\r
+        <id>116290</id>\r
+      </contributor>\r
+      <text xml:space="preserve">&lt;div style="width: {{{ボックスサイズ|305}}}px; margin-bottom: .3em; margin-left: 1em; padding: .2em; float: right; clear: right"&gt;
+&lt;p style="text-align: center; font-size: large; font-weight: bold; margin-bottom: 1px; white-space: nowrap;"&gt;{{{名称|{{PAGENAME}}}}}&lt;/p&gt;
+&lt;div style="border: 1px solid #aaa; background: #f9f9f9; font-size: 80%;"&gt;{{#if:{{{画像|}}}{{{キャプション|}}} | &lt;div style="text-align: center; padding: 1px; margin: 1px; border-bottom: 1px solid #aaa"&gt;[[{{{画像}}}|{{{画像サイズ|300}}}px|{{{キャプション|{{{画像}}}}}}]]
+&lt;p style="text-align: center; margin: 0; padding: 1px;"&gt;{{{キャプション}}}&lt;/p&gt;&lt;/div&gt;}}
+&lt;div style="margin: .1em .1em .2em .4em;"&gt;
+* '''用途''':{{{用途|}}}{{#if:{{{分類|}}}|
+* '''分類''':{{{分類}}}}}{{#if:{{{設計者|}}}|
+* '''設計者''':{{{設計者}}}}}
+* '''製造者''':{{{製造者|}}}
+* '''運用者'''{{#if:{{{運用者 more|}}}|{{{運用者 more}}}|:{{{運用者|}}}}}{{#if:{{{初飛行年月日|}}}|
+* '''初飛行''':{{{初飛行年月日}}}}}{{#if:{{{生産数|}}}|
+* '''生産数''':{{{生産数}}}}}{{#if:{{{生産開始年月日|}}}|
+* '''生産開始''':{{{生産開始年月日}}}}}{{#if:{{{運用開始年月日|}}}|
+* '''運用開始''':{{{運用開始年月日}}}}}{{#if:{{{退役年月日|}}}|
+* '''退役''':{{{退役年月日}}}}}{{#if:{{{退役年月日 more|}}}|
+* '''退役'''{{{退役年月日 more}}}}}{{#if:{{{運用状況|}}}|
+* '''運用状況''':{{{運用状況}}}}}{{#if:{{{ユニットコスト|}}}|
+* '''ユニットコスト''':{{{ユニットコスト}}}}}{{#if:{{{ユニットコスト more|}}}|
+* '''ユニットコスト'''{{{ユニットコスト more}}}}}
+&lt;/div&gt;
+&lt;/div&gt;
+&lt;span class="noprint"&gt;{{Tnavbar|Infobox 航空機|viewplain=1}}&lt;/span&gt;
+&lt;/div&gt;&lt;noinclude&gt;
+{{Documentation}}
+&lt;!-- カテゴリと言語間リンクはここではなく、/doc サブページに追加してください --&gt;
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_Reflist.xml b/WptscsTest/Data/MediaWiki/ja/Template_Reflist.xml
new file mode 100644 (file)
index 0000000..02f771a
--- /dev/null
@@ -0,0 +1,49 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Reflist</title>\r
+    <id>906690</id>\r
+    <revision>\r
+      <id>28036193</id>\r
+      <timestamp>2009-09-17T13:36:14Z</timestamp>\r
+      <contributor>\r
+        <username>Fryed-peach</username>\r
+        <id>63402</id>\r
+      </contributor>\r
+      <text xml:space="preserve">{{#if: {{{scroll|}}}|'''注意''':2009年5月の合意により、脚注をスクロール表示にしたい場合は各自[[MediaWiki:Gadget-ScrolledReflist|Scrolled Reflist]]という[[Wikipedia:ガジェット|ガジェット]]を利用し、Template:Reflistのscrollパラメータは使用しないことになりました。この注意文を取り除くには、&lt;nowiki&gt;{{reflist|scroll=1}}&lt;/nowiki&gt;から&lt;nowiki&gt;"|scroll=1"&lt;/nowiki&gt;の部分を除去してください。なお、{{tl|Reflist}}を使っている項目の脚注部分にはclass名として「reflist」が指定されていますので、ウェブブラウザのユーザスタイルシートに[[MediaWiki:Gadget-ScrolledReflist.css]]の内容を転記すればIP利用者でも同等の効果を得ることができます。}}
+&lt;div class="references-small reflist" style="{{#if: {{{colwidth|}}}| -moz-column-width:{{{colwidth}}}; column-width:{{{colwidth}}}; | {{#if: {{{1|}}}| -moz-column-count:{{{1}}}; column-count:{{{1}}}; }} }}"&gt;
+{{#tag:references|{{{refs|}}}|group={{{group|}}}}}&lt;/div&gt;&lt;noinclude&gt;
+{{Documentation}}
+&lt;!-- カテゴリと言語間リンクはここではなく、/doc サブページに追加してください --&gt;&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_Reflist_doc.xml b/WptscsTest/Data/MediaWiki/ja/Template_Reflist_doc.xml
new file mode 100644 (file)
index 0000000..38b1e2f
--- /dev/null
@@ -0,0 +1,127 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>
+    <generator>MediaWiki 1.16wmf4</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">メディア</namespace>
+      <namespace key="-1" case="first-letter">特別</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">ノート</namespace>
+      <namespace key="2" case="first-letter">利用者</namespace>
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>
+      <namespace key="6" case="first-letter">ファイル</namespace>
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>
+      <namespace key="102" case="first-letter">プロジェクト</namespace>
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>
+    </namespaces>
+  </siteinfo>
+  <page>
+    <title>Template:Reflist/doc</title>
+    <id>1169930</id>
+    <revision>
+      <id>33780015</id>
+      <timestamp>2010-08-31T17:52:07Z</timestamp>
+      <contributor>
+        <username>まさふゆ</username>
+        <id>232040</id>
+      </contributor>
+      <minor/>
+      <text xml:space="preserve">&lt;noinclude&gt;{{Documentation subpage|種類=[[Help:テンプレート|テンプレート]]}}&lt;/noinclude&gt;&lt;includeonly&gt;{{Pp-template}}{{使用箇所の多いテンプレート|80,000以上}}&lt;/includeonly&gt;
+&lt;!-- 以下でテンプレートの解説を編集してください --&gt;
+[[Help:脚注|脚注]]に参照文献リストを載せるためのテンプレート。[[Help:脚注#脚注の作成方法1|&lt;code&gt;&lt;nowiki&gt;&lt;references /&gt;&lt;/nowiki&gt;&lt;/code&gt;]]の代用として&lt;code&gt;&lt;nowiki&gt;{{Reflist}}&lt;/nowiki&gt;&lt;/code&gt;を使用する。
+
+本文と脚注のstyleを変えて、全体を読みやすくしている。
+
+== 使用法 ==
+=== 複数の列 ===
+&lt;code&gt;&amp;#123;&amp;#123;{{BASEPAGENAME}}|2&amp;#125;&amp;#125;&lt;/code&gt;とすると脚注が2列のリストに、&lt;code&gt;&amp;#123;&amp;#123;{{BASEPAGENAME}}|3&amp;#125;&amp;#125;&lt;/code&gt;とすると3列のリストになる。
+
+&lt;code&gt;&amp;#123;&amp;#123;{{BASEPAGENAME}}|colwidth=30em&amp;#125;&amp;#125;&lt;/code&gt;とすると、列数はブラウザに自動設定させる代わりに、列幅を指定できる。
+
+'''注意''':2009年時点では、'''Firefoxなど一部のブラウザのみで有効な機能'''で、IEなどのブラウザでは指定してあっても無視されます。
+
+=== Reflistとreferencesの相違 ===
+参照する項目間の行間の幅が異なる。すなわち、&lt;code&gt;&lt;nowiki&gt;{{Reflist}}&lt;/nowiki&gt;&lt;/code&gt;方式の10項目が&lt;code&gt;&lt;nowiki&gt;&lt;references /&gt;&lt;/nowiki&gt;&lt;/code&gt;方式の約8項目幅内に収まる。
+
+&lt;code&gt;&lt;nowiki&gt;{{Reflist}}&lt;/nowiki&gt;&lt;/code&gt;方式では行間が狭くなる:&lt;ref&gt;1111111111&lt;/ref&gt;&lt;ref&gt;2222222222&lt;/ref&gt;&lt;ref&gt;3333333333&lt;/ref&gt;&lt;ref&gt;4444444444&lt;/ref&gt;&lt;ref&gt;5555555555&lt;/ref&gt;&lt;ref&gt;6666666666&lt;/ref&gt;&lt;ref&gt;7777777777&lt;/ref&gt;&lt;ref&gt;8888888888&lt;/ref&gt;&lt;ref&gt;9999999999&lt;/ref&gt;&lt;ref&gt;0000000000&lt;/ref&gt;
+{{Reflist}}
+下記の&lt;code&gt;&lt;nowiki&gt;&lt;references /&gt;&lt;/nowiki&gt;&lt;/code&gt;方式では行間が広くなる:&lt;ref&gt;1111111111&lt;/ref&gt;&lt;ref&gt;2222222222&lt;/ref&gt;&lt;ref&gt;3333333333&lt;/ref&gt;&lt;ref&gt;4444444444&lt;/ref&gt;&lt;ref&gt;5555555555&lt;/ref&gt;&lt;ref&gt;6666666666&lt;/ref&gt;&lt;ref&gt;7777777777&lt;/ref&gt;&lt;ref&gt;8888888888&lt;/ref&gt;&lt;ref&gt;9999999999&lt;/ref&gt;&lt;ref&gt;0000000000&lt;/ref&gt;
+&lt;references /&gt;
+
+=== group引数 ===
+同一記事内に複数の脚注を設置する場合([[Help:脚注#参考文献リストと注釈リストを別置したいとき|&lt;nowiki&gt;&lt;ref group=&gt;, &lt;references group=&gt;&lt;/nowiki&gt;]]を使用する場合)は、group引数を用いる事で対応可能。
+
+表示例
+* 脚注1では&lt;code&gt;&lt;nowiki&gt;{{Reflist}}&lt;/nowiki&gt;&lt;/code&gt;を使用し、脚注は&lt;nowiki&gt;&lt;ref&gt;〜&lt;/ref&gt;&lt;/nowiki&gt;で括ったもの。&lt;ref&gt;1111111111&lt;/ref&gt;&lt;ref&gt;2222222222&lt;/ref&gt;&lt;ref&gt;3333333333&lt;/ref&gt;&lt;ref&gt;4444444444&lt;/ref&gt;&lt;ref&gt;5555555555&lt;/ref&gt;&lt;ref&gt;6666666666&lt;/ref&gt;&lt;ref&gt;7777777777&lt;/ref&gt;&lt;ref&gt;8888888888&lt;/ref&gt;&lt;ref&gt;9999999999&lt;/ref&gt;&lt;ref&gt;0000000000&lt;/ref&gt;
+* 脚注2では&lt;code&gt;&lt;nowiki&gt;{{Reflist|group=※}}&lt;/nowiki&gt;&lt;/code&gt;を使用し、脚注は&lt;nowiki&gt;&lt;ref group=&quot;※&quot;&gt;〜&lt;/ref&gt;で括ったもの。&lt;/nowiki&gt;&lt;ref group=&quot;※&quot;&gt;aaaaaaaaaa&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;bbbbbbbbbb&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;cccccccccc&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;dddddddddd&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;eeeeeeeeee&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;ffffffffff&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;gggggggggg&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;hhhhhhhhhh&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;iiiiiiiiii&lt;/ref&gt;&lt;ref group=&quot;※&quot;&gt;jjjjjjjjjj&lt;/ref&gt;
+
+==== 脚注1 ====
+{{Reflist}}
+
+==== 脚注2 ====
+{{Reflist|group=※}}
+
+=== scrollパラメータ(現在は[[Help‐ノート:脚注]]の合意に基づき廃止) ===
+'''注意''':2009年5月の合意により、脚注をスクロール表示にしたい場合は各自[[MediaWiki:Gadget-ScrolledReflist|Scrolled Reflist]]という[[Wikipedia:ガジェット|ガジェット]]を利用し、Template:Reflistのscrollパラメータは使用しないことになりました。この注意文を取り除くには、&lt;nowiki&gt;{{reflist|scroll=1}}&lt;/nowiki&gt;から&lt;nowiki&gt;&quot;|scroll=1&quot;&lt;/nowiki&gt;の部分を除去してください。なお、{{tl|Reflist}}を使っている項目の脚注部分にはclass名として「reflist」が指定されていますので、ウェブブラウザのユーザスタイルシートに[[MediaWiki:Gadget-ScrolledReflist.css]]の内容を転記すればIP利用者でも同等の効果を得ることができます。
+
+== 関連項目 ==
+* {{Tl|脚注ヘルプ}}
+
+
+&lt;div style=&quot;visibility:hidden; height:0px; speak:none;&quot;&gt;
+&lt;references /&gt;
+&lt;/div&gt;
+
+&lt;includeonly&gt;
+&lt;!-- カテゴリは以下に追加してください --&gt;
+[[Category:出典テンプレート|{{BASEPAGENAME}}]]
+[[Category:段組みテンプレート|{{BASEPAGENAME}}]]
+&lt;!-- 言語間リンクは以下に追加してください --&gt;
+[[ar:قالب:ثبت المراجع]]
+[[be-x-old:Шаблён:Зноскі]]
+[[ca:Plantilla:Referències]]
+[[en:Template:Reflist]]
+[[eo:Ŝablono:Referencoj]]
+[[es:Plantilla:Listaref]]
+[[fi:Malline:Viitteet]]
+[[fr:Modèle:Références]]
+[[hi:Template:टिप्पणीसूची]]
+[[hr:Predložak:Izvori]]
+[[hsb:Předłoha:Referency]]
+[[hu:Reflist]]
+[[ia:Patrono:Reflist]]
+[[it:Template:References]]
+[[ka:თარგი:სქოლიოს სია]]
+[[ko:틀:주석]]
+[[lv:Veidne:Reflist]]
+[[ml:ഫലകം:Reflist]]
+[[ms:Templat:Reflist]]
+[[no:Mal:Reflist]]
+[[pl:Szablon:Przypisy]]
+[[pt:Predefinição:Reflist]]
+[[ro:Format:Listănote]]
+[[ru:Шаблон:Примечания]]
+[[sr:Шаблон:Напомене]]
+[[sv:Mall:Reflist]]
+[[th:แม่แบบ:รายการอ้างอิง]]
+[[uk:Шаблон:Reflist]]
+[[vi:Bản mẫu:Tham khảo]]
+[[zh:Template:Reflist]]
+&lt;/includeonly&gt;</text>
+    </revision>
+  </page>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_Reusable launch systems.xml b/WptscsTest/Data/MediaWiki/ja/Template_Reusable launch systems.xml
new file mode 100644 (file)
index 0000000..9b25b04
--- /dev/null
@@ -0,0 +1,96 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Reusable launch systems</title>\r
+    <id>1697136</id>\r
+    <revision>\r
+      <id>32573229</id>\r
+      <timestamp>2010-06-13T12:29:45Z</timestamp>\r
+      <contributor>\r
+        <username>SAPAS</username>\r
+        <id>279534</id>\r
+      </contributor>\r
+      <minor />\r
+      <text xml:space="preserve">{{Navbox with collapsible groups
+|name  = Reusable launch systems
+|state = {{{state|&lt;includeonly&gt;collapsed&lt;/includeonly&gt;&lt;noinclude&gt;expanded&lt;/noinclude&gt;}}}
+|title = [[再使用型宇宙往還機|再利用型打ち上げシステム]]
+|sect1 = 部分的再使用
+|groupstyle=background:lightsteelblue;
+&lt;!--|abbr1 = Partial--&gt;
+|state1 = expanded
+|list1 =
+ {{Navbox subgroup
+  |groupstyle = padding:0.35em 0; line-height:1.1em; width:7.0em; 
+  |liststyle  = padding:0.25em 0; line-height:1.4em; width:auto;
+  |group1 = 現役
+  |list1  = [[ファルコン1]]&amp;nbsp;&amp;#124;&amp;nbsp;[[スペースシャトル]]
+  |group2 = 計画
+  |list2  = [[アレスI]]&amp;nbsp;&amp;#124;&amp;nbsp;[[アレスV]]&amp;nbsp;&amp;#124;&amp;nbsp;[[プロジェクト 921-3|神舟宇宙船]]&amp;nbsp;&amp;#124;&amp;nbsp;[[プロジェクト 921-3#HTS 磁気浮上式打ち上げ補助技術|HTS 磁気浮上式打ち上げ補助技術]]&amp;nbsp;&amp;#124;&amp;nbsp;[[シルバー・ダート (宇宙船)|シルバー・ダート]]&lt;!--&amp;nbsp;&amp;#124;&amp;nbsp;[[クリーペル]] -- 打ち上げシステムではない--&gt;
+  |group3 = 退役
+  |list3 = 
+  |group4 = 中止
+  |list4  = [[サターン-シャトル]]&amp;nbsp;&amp;#124;&amp;nbsp;[[シャトル-C]]&lt;!--&amp;nbsp;&amp;#124;&amp;nbsp;[[ブラン]] -- 打ち上げシステムではない--&gt;
+ }}
+
+|sect2 = 完全再使用
+&lt;!--|abbr2 = Complete--&gt;
+|state2 = expanded
+|list2 =
+ {{Navbox subgroup
+  |groupstyle = padding:0.35em 0; line-height:1.1em; width:7.0em;
+  |liststyle  = padding:0.25em 0; line-height:1.3em; width:auto; &lt;!--as above--&gt; 
+  |group1 = 現役
+  |list1  = 
+  |group2 = 計画
+  |list2  = [[Avatar (rocket)|Avatar]]&amp;nbsp;&amp;#124;&amp;nbsp;[[ファルコン9]]&amp;nbsp;&amp;#124;&amp;nbsp;[[リアクション・エンジンズ・スカイロン|スカイロン]]&amp;nbsp;&amp;#124;&amp;nbsp;''[[スペースシップツー]]''&amp;nbsp;&amp;#124;&amp;nbsp;[[スケールド・コンポジッツ・スペースシップ・スリー|スペースシップ・スリー]]
+  |group3 = 退役
+  |list3  = ''[[スペースシップワン]]''&amp;nbsp;&amp;#124;&amp;nbsp;''[[X-15 (航空機)|X-15]]''
+  |group4 = 中止
+  |list4  = [[エネルギア II|エネルギア II/ウラガン]]&amp;nbsp;&amp;#124;&amp;nbsp;[[ファルコン 5]]&amp;nbsp;&amp;#124;&amp;nbsp;[[K-1 ロケット|K-1]]&amp;nbsp;&amp;#124;&amp;nbsp;[[ベンチャースター]] &amp;nbsp;&amp;#124;&amp;nbsp;[[ホッパー (宇宙船)|ホッパー]]
+ }}
+
+|below = &lt;div style="float:right"&gt;&lt;span style="font-size:95%"&gt;[[弾道飛行]]打ち上げシステムは ''斜体'' で表記&lt;/span&gt;&lt;/div&gt;
+}}[[Category:再使用型打ち上げシステム&lt;noinclude&gt;|τ&lt;/noinclude&gt;]]&lt;noinclude&gt;
+&lt;br/&gt;{{collapsible option}}&lt;!--&lt;br/&gt;&lt;hr/&gt;{{collapsible sections option |list="Partial" and "Complete" |example=Complete}}--&gt;
+
+===関連===
+*{{lt|Expendable launch systems}}
+
+[[Category:宇宙開発関連のテンプレート]]
+
+[[en:Template:Reusable launch systems]]
+[[zh:Template:RLVs]]
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_cite news.xml b/WptscsTest/Data/MediaWiki/ja/Template_cite news.xml
new file mode 100644 (file)
index 0000000..036726e
--- /dev/null
@@ -0,0 +1,136 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Cite news</title>\r
+    <id>593521</id>\r
+    <revision>\r
+      <id>33118646</id>\r
+      <timestamp>2010-07-19T09:16:42Z</timestamp>\r
+      <contributor>\r
+        <username>Hatukanezumi</username>\r
+        <id>74377</id>\r
+      </contributor>\r
+      <comment>p., pp.トル</comment>\r
+      <text xml:space="preserve">&lt;includeonly&gt;{{Citation/core
+  |Citation class=news
+  |Surname1 = {{{last|{{{surname|{{{last1|{{{surname1|{{{author1|{{{author|{{{authors|{{{author|}}}}}}}}}}}}}}}}}}}}}}}}
+  |Surname2 = {{{last2|{{{surname2|{{{author2|{{{coauthor|{{{coauthors|}}}}}}}}}}}}}}}
+  |Surname3 = {{{last3|{{{surname3|{{{author3|}}}}}}}}}
+  |Surname4 = {{{last4|{{{surname4|{{{author4|}}}}}}}}}
+  |Surname5 = {{{last5|{{{surname5|{{{author5|}}}}}}}}}
+  |Surname6 = {{{last6|{{{surname6|{{{author6|}}}}}}}}}
+  |Surname7 = {{{last7|{{{surname7|{{{author7|}}}}}}}}}
+  |Surname8 = {{{last8|{{{surname8|{{{author8|}}}}}}}}}
+  |Surname9 = {{{last9|{{{surname9|{{{author9|}}}}}}}}}
+  |Given1 = {{{first1|{{{given1|{{{first|{{{given|}}}}}}}}}}}}
+  |Given2 = {{{first2|{{{given2|}}}}}}
+  |Given3 = {{{first3|{{{given3|}}}}}}
+  |Given4 = {{{first4|{{{given4|}}}}}}
+  |Given5 = {{{first5|{{{given5|}}}}}}
+  |Given6 = {{{first6|{{{given6|}}}}}}
+  |Given7 = {{{first7|{{{given7|}}}}}}
+  |Given8 = {{{first8|{{{given8|}}}}}}
+  |Given9 = {{{first9|{{{given9|}}}}}}
+  |Authorlink1 = {{{author-link|{{{author1-link|{{{authorlink|{{{authorlink1|}}}}}}}}}}}}
+  |Authorlink2 = {{{author2-link|{{{authorlink2|}}}}}}
+  |Authorlink3 = {{{author3-link|{{{authorlink3|}}}}}}
+  |Authorlink4 = {{{author4-link|{{{authorlink4|}}}}}}
+  |Authorlink5 = {{{author5-link|{{{authorlink5|}}}}}}
+  |Authorlink6 = {{{author6-link|{{{authorlink6|}}}}}}
+  |Authorlink7 = {{{author7-link|{{{authorlink7|}}}}}}
+  |Authorlink8 = {{{author8-link|{{{authorlink8|}}}}}}
+  |Authorlink9 = {{{author9-link|{{{authorlink9|}}}}}}
+  |Year = {{{year|{{&lt;!-- attempt to derive year from date, if possible --&gt;
+             #if:{{{date|}}}
+             |{{
+                #iferror:{{#time:Y|{{{date|}}}}}
+                |{{#iferror:{{#time:Y|{{{publication-date|einval}}}}}||{{#time:Y|{{{publication-date|}}}}}}}
+                |{{#time:Y|{{{date|}}}}}
+              }}
+             |{{{publication-date|}}}&lt;!-- last resort --&gt;
+           }}
+        }}}
+  |Date = {{#if:{{{date|}}}|{{{date}}}|{{{day|}}}{{{month|}}}{{{year|{{{publication-date|}}}}}}}}
+  |DateFormat = {{{dateformat|}}}
+  |Title = {{#if:{{{journal|{{{periodical|{{{newspaper|{{{magazine|{{{work|}}}}}}}}}}}}}}}|{{{title|}}}}}
+  |TransTitle = {{{trans_title|}}}
+  |URL = {{#if:{{{archiveurl|}}}|{{{archiveurl}}}|{{{url|}}}}}
+  |Series ={{{agency|}}}
+  |Periodical = {{{journal|{{{periodical|{{{newspaper|{{{magazine|{{{work|}}}}}}}}}}}}}}}
+  |Volume = {{{volume|}}}
+  |Issue = {{{issue|{{{number|}}}}}}
+  |At = {{
+           #if:{{{page|}}}
+           |&amp;#32;{{{page}}}
+           |{{
+              #if:{{{pages|}}}
+              |&amp;#32;{{{pages}}}
+              |{{{at|}}}
+            }}
+         }}
+  |IncludedWorkTitle = {{#if:{{{journal|{{{periodical|{{{newspaper|{{{magazine|{{{work|}}}}}}}}}}}}}}}||{{{title|}}}}}
+  |IncludedWorkURL = {{{chapter-url|{{{chapterurl|{{{contribution-url|}}}}}}}}}
+  |Edition = {{{edition|}}}
+  |Place = {{{place|{{{location|}}}}}}
+  |PublicationPlace = {{{publication-place|{{{place|{{{location|}}}}}}}}}
+  |Publisher = {{{publisher|}}}
+  |PublicationDate = {{{publication-date|}}}
+  |language = {{{language|{{{in|}}}}}}
+  |format = {{{format|}}}
+  |ID = {{{id|{{{ID|}}}}}}
+  |ISBN = {{{isbn|{{{ISBN|}}}}}}
+  |ISSN = {{{issn|{{{ISSN|}}}}}}
+  |OCLC = {{{oclc|{{{OCLC|}}}}}}
+  |PMID = {{{pmid|{{{PMID|}}}}}}
+  |PMC = {{{pmc|{{{PMC|}}}}}}
+  |Bibcode = {{{bibcode|}}}
+  |DOI = {{{doi|{{{DOI|}}}}}}
+  |AccessDate = {{#if:{{{accessdate|}}}|{{ISOdate|{{{accessdate}}}}}|{{
+    #if:{{{accessdaymonth|}}}|{{{accessdaymonth}}}{{{accessyear|}}}|{{
+      #if:{{{accessmonthday|}}}|{{{accessmonthday}}}{{{accessyear|}}}|
+      {{{accessday|}}}{{{accessmonth|}}}{{{accessyear|}}}
+      }}
+    }}
+   }}
+  |laysummary = {{{laysummary|}}}
+  |laydate = {{{laydate|}}}
+  |quote = {{{quote|}}}
+  |PS = &lt;!-- {{#if:{{{quote|}}}||.}} --&gt;
+  |Ref = {{{ref|}}}
+  |Sep = {{#ifeq:{{{separator|{{{seperator}}}}}}|;|&amp;#059;|{{{separator|{{{seperator|.}}}}}}}}
+  |ArchiveDate = {{ISOdate|{{{archivedate|}}}}}
+  |OriginalURL = {{#if:{{{archiveurl|}}}|{{#if:{{{url|}}}|{{{url}}}}}}}
+}}&lt;/includeonly&gt;&lt;noinclude&gt;
+{{Documentation}}&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_cite web.xml b/WptscsTest/Data/MediaWiki/ja/Template_cite web.xml
new file mode 100644 (file)
index 0000000..b41adc2
--- /dev/null
@@ -0,0 +1,139 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="ja">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>
+    <generator>MediaWiki 1.17wmf1</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">メディア</namespace>
+      <namespace key="-1" case="first-letter">特別</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">ノート</namespace>
+      <namespace key="2" case="first-letter">利用者</namespace>
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>
+      <namespace key="6" case="first-letter">ファイル</namespace>
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>
+      <namespace key="102" case="first-letter">プロジェクト</namespace>
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>
+    </namespaces>
+  </siteinfo>
+  <page>
+    <title>Template:Cite web</title>
+    <id>464640</id>
+    <revision>
+      <id>33193150</id>
+      <timestamp>2010-07-24T12:33:13Z</timestamp>
+      <contributor>
+        <username>Wdpp</username>
+        <id>24109</id>
+      </contributor>
+      <minor/>
+      <comment>ダブルクォーテーションをU+201C / U+201Dのペアに変更</comment>
+      <text xml:space="preserve" bytes="3636">&lt;includeonly&gt;&lt;onlyinclude&gt;&lt;cite style=&quot;font-style:normal&quot;&gt;{{
+#if: {{#if: {{{url|}}} | {{#if: {{{title|}}} |1}}}}
+  || &amp;#32;&lt;strong class=&quot;error&quot;&gt;[[Template:Cite web]]の呼び出しエラー:引数 '''url''' と '''title''' は必須です。&lt;/strong&gt;{{#if: {{NAMESPACE}}|| [[Category:テンプレート呼び出しエラーのあるページ/Template:Cite web]]}}
+}}{{
+#if: {{{archiveurl|}}}{{{archivedate|}}} 
+  | {{#if: {{#if: {{{archiveurl|}}}| {{#if: {{{archivedate|}}} |1}}}}
+    || &amp;#32;&lt;strong class=&quot;error&quot;&gt;[[Template:Cite web]]の呼び出しエラー:引数 '''archiveurl''' と '''archivedate''' は両方を指定してください。&lt;/strong&gt;{{#if: {{NAMESPACE}}|| [[Category:テンプレート呼び出しエラーのあるページ/Template:Cite web]]}}
+  }}
+}}{{#if: {{{author|{{{last|}}}}}}
+  | {{#if: {{{authorlink|}}}
+    | [[{{{authorlink}}}|{{#if: {{{last|}}}
+      | {{{last}}}{{#if: {{{first|}}} | , {{{first}}} }}
+      | {{{author}}}
+      }}]]
+    | {{#if: {{{last|}}}
+      | {{{last}}}{{#if: {{{first|}}} | , {{{first}}} }}
+      | {{{author}}}
+    }}
+  }}
+}}{{#if: {{{author|{{{last|}}}}}}
+  | {{#if: {{{coauthors|}}}| &lt;nowiki&gt;;&lt;/nowiki&gt;&amp;#32;{{{coauthors}}} }}
+}}{{#if: {{{author|}}}{{{last|}}}
+  | {{#if: {{{date|}}}
+    | &amp;#32;({{ISOdate|{{{date}}}}})
+    | {{#if: {{{year|}}}
+      | {{#if: {{{month|}}}
+        | &amp;#32;({{{month}}} {{{year}}})
+        | &amp;#32;({{{year}}})
+      }}
+    }}
+  |}}
+}}{{#if: {{{last|}}}{{{author|}}}
+  | .&amp;#32;}}{{
+  #if: {{{editor|}}}
+  | &amp;#32;{{{editor}}}:
+}}{{Lang|en|“}}{{#if: {{{archiveurl|}}}
+  |{{#if: {{{archiveurl|}}}
+    |{{#if: {{{title|}}} | [{{{archiveurl}}} {{{title}}}]
+    }}
+  }}
+  |{{#if: {{{url|}}}
+    |{{#if: {{{title|}}}
+      |{{#ifeq: {{{format|}}}
+        |PDF
+        |{{PDFlink|1=[{{{url}}} {{{title}}}]}}
+        |[{{{url}}} {{{title}}}]
+      }}
+      |{{#ifeq: {{{format|}}}
+        |DOC
+        |{{DOClink|1=[{{{url}}} {{{title}}}]}}
+        |
+      }}
+    }}
+  }}
+}}{{Lang|en|”}}{{#ifeq: {{{format|PDF}}}
+  | PDF || {{#if: {{{format|}}}| &amp;#32;({{{format}}}) | }}
+}}{{#ifeq: {{{format|DOC}}}
+  | DOC || {{#if: {{{format|}}}| | }}
+}}{{#if:{{{language|}}} 
+  | &amp;#32;({{{language}}})
+}}{{#if: {{{work|}}}
+  | .&amp;#32;''{{{work}}}''
+}}{{#if: {{{pages|}}}
+  | &amp;#32;{{{pages}}}
+}}{{#if: {{{publisher|}}}
+  | .&amp;#32; {{#if: {{{location|}}}
+    | {{{location}}}:&amp;#32;
+  }} {{{publisher}}}&lt;!--{{#if: {{{author|}}}{{{last|}}}
+    | 
+    | {{#if: {{{date|}}}{{{year|}}}{{{month|}}} || }}
+  }}--&gt;
+}}{{#if: {{{author|}}}{{{last|}}}
+  ||{{#if: {{{date|}}}
+    | &amp;#32;({{ISOdate|{{{date}}}}})
+    | {{#if: {{{year|}}}
+      | {{#if: {{{month|}}}
+        | &amp;#32;({{{month}}} {{{year}}})
+        | &amp;#32;({{{year}}})
+      }}
+    }}
+  }}
+}}.{{#if: {{{doi|}}} 
+  | &amp;#32;[[デジタルオブジェクト識別子|doi]]:[http://dx.doi.org/{{{doi|{{{doilabel|}}}}}} {{{doi}}}].
+}}{{#if: {{{archivedate|}}}
+  | &amp;#32;{{ISOdate|{{{archivedate|}}}}}時点の[{{{url}}} オリジナル]よりアーカイブ。
+}}{{#if: {{{accessdate|}}}
+  | {{#if:{{{archivedate|}}}||&amp;#32;|}}{{#if: {{{accessyear|}}} | {{年月日|year={{{accessyear|}}}}}{{{accessdate|}}} | {{ISOdate|{{{accessdate|}}}}}}}閲覧。
+  | &amp;#32;&lt;strong class=&quot;error&quot;&gt;[[Template:Cite web]]の呼び出しエラー:引数 '''accessdate''' は必須です。&lt;/strong&gt;{{#if: {{NAMESPACE}}|| [[Category:テンプレート呼び出しエラーのあるページ/Template:Cite web]]}}
+}}{{#if: {{{quote|}}} 
+  | &amp;nbsp;“{{{quote}}}”
+}}&lt;/cite&gt;&lt;/onlyinclude&gt;&lt;/includeonly&gt;
+{{Documentation}}
+&lt;!-- カテゴリと言語間リンクはここではなく、/doc サブページに追加してください --&gt;</text>
+    </revision>
+  </page>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_commonscat.xml b/WptscsTest/Data/MediaWiki/ja/Template_commonscat.xml
new file mode 100644 (file)
index 0000000..f0038c4
--- /dev/null
@@ -0,0 +1,49 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Commonscat</title>\r
+    <id>206282</id>\r
+    <revision>\r
+      <id>34025031</id>\r
+      <timestamp>2010-09-16T08:33:43Z</timestamp>\r
+      <contributor>\r
+        <username>柑橘類</username>\r
+        <id>112137</id>\r
+      </contributor>\r
+      <comment>一旦差し戻し。他のプロジェクトリンクテンプレートとの統一性もあるのでどこかで提案してからの方がよいと思います。</comment>\r
+      <text xml:space="preserve">&lt;includeonly&gt;&lt;div class="infobox sisterproject noprint"&gt;[[ファイル:Commons-logo.svg|50px|left|ウィキメディア・コモンズ]]&lt;div class="plainlinks" style="margin-left:50px"&gt;'''[[Wikipedia:ウィキメディア・コモンズ|ウィキメディア・コモンズ]]'''には、'''[[commons:Category:{{{1|{{{ページ名|{{PAGENAME}}}}}}}}|{{{2|{{{タイトル|{{PAGENAME}}}}}}}}]]'''{{#if:{{{追加1|}}}|と'''[[commons:Category:{{{追加1|}}}|{{{タイトル1|{{{追加1}}}}}}]]'''}}{{#if:{{{追加2|}}}|と'''[[commons:Category:{{{追加2|}}}|{{{タイトル2|{{{追加2}}}}}}]]'''}}に関連するカテゴリがあります。&lt;/div&gt;&lt;/div&gt;&lt;/includeonly&gt;&lt;noinclude&gt;
+{{Documentation}}
+&lt;!-- カテゴリと言語間リンクはここではなく、/docサブページに追加してください --&gt;
+&lt;/noinclude&gt;</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/Template_ref-en.xml b/WptscsTest/Data/MediaWiki/ja/Template_ref-en.xml
new file mode 100644 (file)
index 0000000..d3f3566
--- /dev/null
@@ -0,0 +1,47 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>Template:Ref-en</title>\r
+    <id>559251</id>\r
+    <redirect />\r
+    <revision>\r
+      <id>9246048</id>\r
+      <timestamp>2006-12-04T08:34:39Z</timestamp>\r
+      <contributor>\r
+        <username>Ytsunenori</username>\r
+        <id>16940</id>\r
+      </contributor>\r
+      <comment>[[Template:En icon]]へのリダイレクト</comment>\r
+      <text xml:space="preserve">#REDIRECT [[Template:En icon]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/VSSエンタープライズ.xml b/WptscsTest/Data/MediaWiki/ja/VSSエンタープライズ.xml
new file mode 100644 (file)
index 0000000..a4f56a8
--- /dev/null
@@ -0,0 +1,32 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/_api.xml b/WptscsTest/Data/MediaWiki/ja/_api.xml
new file mode 100644 (file)
index 0000000..d74445f
--- /dev/null
@@ -0,0 +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
+</api>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/カリフォルニア州.xml b/WptscsTest/Data/MediaWiki/ja/カリフォルニア州.xml
new file mode 100644 (file)
index 0000000..27ff0a5
--- /dev/null
@@ -0,0 +1,1181 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>カリフォルニア州</title>\r
+    <id>8956</id>\r
+    <revision>\r
+      <id>34053136</id>\r
+      <timestamp>2010-09-17T23:44:55Z</timestamp>\r
+      <contributor>\r
+        <username>Dr jimmy</username>\r
+        <id>111486</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>/* 日本の企業進出 */</comment>\r
+      <text xml:space="preserve">{{redirect|カリフォルニア}}
+{{基礎情報 アメリカ合衆国の州
+|公式名称    = State of California
+|州旗        = Flag of California.svg
+|州章        = Seal of California.svg
+|地図        = Map of USA CA.svg
+|愛称        = ゴールデンステート&lt;br /&gt;The Golden State
+|州都        = [[サクラメント (カリフォルニア州)|サクラメント]]
+|最大都市    = [[ロサンゼルス]]
+|州知事      = [[アーノルド・シュワルツェネッガー]] 
+|公用語      = [[英語]] &lt;!--1986年--&gt;
+|面積順位    = 3
+|総面積      = 423,970
+|面積大きさ  = 1 E11
+|陸地面積    = 403,932
+|水域面積    = 20,047
+|水面積率    = 4.7
+|人口統計年  = 2003
+|人口順位    = 1
+|人口値      = 35,484,453
+|人口大きさ  = 1 E7
+|人口密度    = 90.49
+|加入順      = 31
+|加入日      = [[1850年]][[9月9日]]
+|時間帯      = -8
+|夏時間      = -7
+|緯度        = 32°32' - 42°
+|経度        = 114°8' - 124°26'
+|幅          = 402.5
+|長さ        = 1,240
+|最高標高    = 4,418
+|平均標高    = 884
+|最低標高    = -86
+|ISOコード   = US-CA
+|Website     = ca.gov
+|}}
+'''カリフォルニア州'''('''California'''、{{IPA-en|ˈkælɨˈfɔrnjə}} 、略号:CA)は[[アメリカ合衆国]]西部、[[太平洋]]岸の[[州]]。[[アメリカ西海岸]]の大部分を占める。州都は、[[サクラメント (カリフォルニア州)|サクラメント]]である。
+
+合衆国の州のうちでは最大の[[人口]]を誇り&lt;ref name="popEst"&gt;{{cite web|url=http://www.census.gov/popest/states/tables/NST-EST2009-01.csv|format=CSV|title=Table 1. Annual Estimates of the Population for the United States, Regions, States, and Puerto Rico: April 1, 2000 to July 1, 2009|date=December 22, 2009|publisher=U.S. Census Bureau|accessdate=December 24, 2009}}&lt;/ref&gt;、大統領選の選挙人数も最多である。[[ブラジル]]の[[サンパウロ州]]に続いて[[アメリカ州|南北アメリカ大陸]]で2番目に人口の多い行政区画である。大都市は人口の多いものから[[ロサンゼルス]]、[[サンディエゴ]]、[[サンノゼ]]、[[サンフランシスコ]]となっている&lt;ref name="CA popEst"&gt;{{Cite web
+  | title = E-4 Population Estimates for Cities, Counties and the State, 2001?2009, with 2000 Benchmark.
+  | location = Sacramento, California
+  | publisher = State of California, Department of Finance
+  | year = 2009 | month = May
+  | url = http://www.dof.ca.gov/research/demographic/reports/estimates/e-4/2001-09/
+  | accessdate = December 24, 2009}}&lt;/ref&gt;。州内には全国で2位(ロサンゼルス)と6位([[サンフランシスコ・ベイエリア]])の都市圏があり、人口の多い都市50傑には8つの市が入っている。
+
+[[ワシントン州]]、[[オレゴン州]]と共にリベラルな気風で、保守的な中西部に対して「レッドウッド・カーテンの向こう側」と称される。
+
+かつて日本では漢字で「加利福尼亜」と表記されることもあったが、現在ではあまり用いられない。この略である「加州」は、新聞の見出しのような字数制限のある場合など、現在でも用いられることがある。なお、「州」がない「加」一文字の場合はカリフォルニア州ではなくカナダの略称である。
+
+カリフォルニア州は多様な気候と地形があり、また多くの民族が住んでいる。合衆国の州のうちで面積ではアラスカ州とテキサス州に次いで3番目である&lt;ref name="2000 population and housing"&gt;{{cite web|url=http://www.census.gov/prod/cen2000/phc3-us-pt1.pdf |format=PDF |title=2000 Census of Population and Housing|year=2004 |month=April |publisher=US Census Bureau |page=29|accessdate=December 25, 2009}}&lt;/ref&gt;。北はオレゴン州、北東は[[ネバダ州]]、南東は[[アリゾナ州]]に接し、南は[[メキシコ]]の[[バハ・カリフォルニア州]]に接している。地理的には太平洋岸から東の[[シエラネバダ山脈 (アメリカ合衆国)|シエラネバダ山脈]]まで、南東は[[モハーヴェ砂漠]]、北西には[[セコイア]]や[[ベイマツ]]の森林がある。州の中央には世界でも最大級に生産性の高い農業地帯、[[カリフォルニアセントラルヴァレー]]がある。[[アメリカ合衆国本土]]では最高の標高地点([[ホイットニー山]])と最低の地点([[デスヴァレー (カリフォルニア州)|デスバレー]])がある。面積のおよそ40%は森林であり&lt;ref name="Forestry 2003"&gt;{{Cite book
+  | last = Laaksonen-Craig  | first = Susanna
+  | last2 = Goldman | first2 = George
+  | last3 = McKillop | first3 = William
+  | title = Forestry, Forest Products, and Forest Products Consumption in California
+  | publisher = University of California ? Division of Agriculture and Natural Resources 
+  | year = 2003  | location = Davis, California  | page = 1
+  | url = http://anrcatalog.ucdavis.edu/pdf/8070.pdf  | format = PDF
+  | isbn = 978-1-60107-248-1}}&lt;/ref&gt;、比較的乾燥した地域としては森林が多い。
+
+18世紀の後半から[[アルタ・カリフォルニア]]と呼ばれた地域は[[スペイン帝国]]の植民地となった。[[1821年]]にアルタ・カリフォルニアを含み[[メキシコ]]が[[メキシコ帝国|第一メキシコ帝国]]となって帝政を布いた後に共和国に変わった。[[1846年]]、ソノマにいたアメリカ人開拓者の集団が[[カリフォルニア共和国]]の独立を宣言した。その直後の[[米墨戦争]]の結果、メキシコはカリフォルニアをアメリカ合衆国に割譲した。カリフォルニアは[[1850年]][[9月9日]]にアメリカ合衆国第31番目の州となった。
+
+19世紀半ば、[[カリフォルニア・ゴールドラッシュ]]によって、カリフォルニアでは社会、経済および人口に劇的な変化が起こった。人々が流入し好景気が訪れたことでサンフランシスコはテントの集まった小村から世界にも知られたブームの町に成長した。20世紀初期の重要な発展としては娯楽産業の中心としてのロサンゼルスの勃興と巨大な州全体に広がる観光産業があった。豊かな農業に加えて航空宇宙産業、石油産業および情報技術が経済発展に貢献した。カリフォルニア州が1つの国であるとすれば、[[国内総生産|GDP]]では[[イタリア]]に匹敵する[[国の国内総生産順リスト (為替レート)|第10位]]である。[[国の人口順リスト|人口]]でも第35位、[[国の面積順リスト|国土]]では第59位になる
+
+== 歴史 ==
+{{Main|カリフォルニア州の歴史}}
+{{See also|スペインによるアメリカ大陸の植民地化|メキシコ独立革命|}} 
+
+[[サンフランシスコ・ベイエリア]]を中心とする北部と、[[農業]]が盛んな中部、[[ロサンゼルス]]~[[サンディエゴ]]帯を中心とする南部に分かれる。ベイエリアには[[シリコンバレー]]が含まれ、全米で最も経済的に進んだ地域のひとつである。[[ロサンゼルス]]は[[ハリウッド]]を抱えるなど、[[エンターテイメント]]産業の世界的中心である。
+
+[[アジア]]や[[メキシコ]]に近いため、[[移民]]が多い。[[移民]]はそれぞれの居住区に固まる傾向が強く、「[[人種のるつぼ|民族のサラダボウル]]」という形容が当てはまる。[[中華街|チャイナタウン]]、[[コリア・タウン|コリアンタウン]]、[[リトルトーキョー]]、[[リトルサイゴン]]、[[リトルインディア]]などが有名である。なかでも隣接した[[メキシコ]]からの移民が多く、[[スペイン語]]は州準公用語となっている。
+
+南部の多くはかつて[[メキシコ]]の領土で、元々は[[スペイン人]]によって開拓されたが、[[1848年]]の[[米墨戦争]]の結果、[[ニューメキシコ]]とともにメキシコからアメリカに1,500万ドルで割譲され、アメリカ領となった(同時に[[テキサス州|テキサス]]のアメリカ領有も確定した)。そのため、カリフォルニア州には[[スペイン語]]由来の[[地名]]が非常に多い。
+
+後に[[アメリカ合衆国大統領]]となった、[[ロナルド・レーガン]]はカリフォルニア州[[知事]]を経験している。[[2003年]][[10月]]には、[[俳優]]で[[オーストリア]]生まれの[[アーノルド・シュワルツェネッガー]]が州知事に当選した。
+
+=== 名称の由来 ===
+「カリフォルニア」という名称は当初、今日のカリフォルニア州に加えてネバダ州、ユタ州、アリゾナ州およびワイオミング州の一部とメキシコの[[バハ・カリフォルニア半島]]からなる地域を指していた。
+
+カリフォルニアの語源は黒人の[[アマゾーン|アマゾン族]]の人々が住み、女王カリフィア(恐らくは[[カリフ]]が語源&lt;ref name=cpn/&gt;)が支配する空想上の天国から派生したというのが最も普通に信じられている。カリフィアの神話は、スペイン人冒険家で作家のガルチ・ロドリゲス・デ・モンタルボによって騎士道物語『アマディス・デ・ガウラ』の続編として書かれた1510年の作品『エスプランディアンの功績』に記録されている&lt;ref name=cpn&gt;Gudde, Erwin G. and William Bright. 2004. California Place Names: The Origin and Etymology of Current Geographical Names. P.59-60&lt;/ref&gt;&lt;ref name="Lavender 1987"&gt;{{cite book |last=Lavender |first=David |title=California: Land of New Beginnings |publisher=University of Nebraska Press |year=1987 |pages=27 |isbn=0803279248 |oclc=15315566}}&lt;/ref&gt;&lt;ref&gt;http://www.etymonline.com/index.php?search=california&amp;searchmode=none&lt;/ref&gt;。モンタルボに拠れば、女王カリフィアの王国はグリフォンなど奇妙な怪獣が住み、金が豊富な遠隔の土地であるとされていた。
+{{Quotation|ご存知のようにインドの右手にはカリフォルニアという名前の島があり、地球上の天国の一部に大変近い。黒人の女性が住んでおり、一人も男は居ない。アマゾン族の様式で生活している。彼女達は頑健な体をしており、強く情熱的な心と偉大な美徳がある。この島自体は目立つゴツゴツした岩のために世界でも最も荒々しい島の一つである。その武器は全て金で作られている。島のどこにも金や高価な石で溢れ、その上に他の金属は見つからない&lt;ref&gt;Person-Lynn, 2004.&lt;/ref&gt;。}}
+
+カリフォルニアという地名はアメリカ合衆国でヨーロッパ人が着けた地名としては5番目に古く今も使われているものであり、エルナン・コルテスの命令で1553年にバハ・カリフォルニアの南端に上陸したディエゴ・デ・バセラとフォルトゥン・ヒメネスが率いたスペイン遠征隊によって「[[カリフォルニア島]]」として命名された。&lt;ref&gt;スペイン人歴史家アントニオ・デ・ヘレラ・イ・トルデシラスが1601年に出版した史料に拠れば、[[フロリダ]]、[[ドライ・トートガス]]、[[ケープ・カナベラル]]および[[アパラチア山脈|アパラチアン]]がそれ以前に名付けられた地名である&lt;/ref&gt;&lt;ref name="Stewart 1945"&gt;{{cite book |title=Names on the Land: A Historical Account of Place-Naming in the United States |last= Stewart|first=George |authorlink=|year=1945 |publisher= Random House|location=New York |pages= 11-17}}&lt;/ref&gt;。
+
+== 地理 ==
+アメリカ大陸の西部、[[シエラネバダ山脈 (アメリカ合衆国)|シエラネバダ山脈]]の西側の[[太平洋]]に面した地域である。[[環太平洋造山帯]]に含まれ度々[[マグニチュード]]8クラスの[[地震]]を経験している。
+
+州は南北に長い形状で、最南端の都市[[サンディエゴ]]には[[アメリカ=メキシコ国境|メキシコとの国境]]があり、不法移民の入国も絶えない。北部は[[オレゴン州]]に、東側は[[ネバダ州]]・[[アリゾナ州]]に隣接している。
+
+[[ファイル:USA Mt Shasta pano CA.jpg|thumb|400px|right|[[シャスタ山]]の麓にあるマウントシャスタの町並み]]
+州の中央にはカリフォルニアセントラルヴァレーがあり、西の海岸山脈と東のシエラネバダ山脈に、北は[[カスケード山脈]]、南は[[テハチャピ山地]]に囲まれている。セントラルヴァレーはカリフォルニアの農業中心であり、国内食糧生産高の約3分の1を生産している&lt;ref name="Peak Oil"&gt;{{cite web |url=http://www.culturechange.org/cms/index.php?option=com_content&amp;task=view&amp;id=56&amp;Itemid=32 |title=Lessons for California and the U.S. from movie "How Cuba survived Peak Oil" |publisher=Culture Change |author=Alice Friedemann |accessdate=June 30, 2007}}&lt;/ref&gt;。セントラルヴァレーはサクラメント=サンホアキン・デルタによって2つに分かれており、北側のサクラメント・バレーには[[サクラメント川]]が流れ、南側のサンホアキン・バレーにはサンホアキン川が流れている。どちらのバレーもそこを横切る川の名前が採られている。サクラメント川とサンホアキン川を浚渫することで両川は十分な深さが保たれ、内陸の都市幾つかでも海港になっている。そのデルタは州内の重要な水の供給源にもなっている。水はデルタ地域から汲み上げられ、セントラルバレー・プロジェクトや州水道プロジェクトなどを含み、州の長さに相当するような広範な運河網を使って運ばれる。デルタ地帯からの水は州人口の3分の2にあたる2,300万人近い住人の飲料水になり、サンホアキン・バレーの西では農業用水になっている。南部海岸には[[チャンネル諸島 (カリフォルニア州)|チャンネル諸島]]が浮かんでいる。
+
+[[ファイル:A rainbow over Bridalveil Fall seen from Tunnel View in Yosemite NP.jpg|thumb|left|200px|氷河の支脈で造られたU字形渓谷から流れ出るブライダルベールの滝]]
+シエラネバダ山脈(スペイン語で雪の山脈)にはアメリカ合衆国本土では最高峰であるホイットニー山(標高14,505フィート、4,421 m)がある&lt;ref name="usgs"&gt;{{cite web |date=April 29, 2005 |url=http://erg.usgs.gov/isb/pubs/booklets/elvadist/elvadist.html#Highest |title=Elevations and Distances in the United States |publisher=U.S Geological Survey |dateformat=mdy |accessdate= December 24, 2009}}&lt;/ref&gt;。この山脈には、氷河が削ったことで有名な[[ヨセミテ国立公園|ヨセミテ・バレー]]や、地球上最大の生物[[セコイアデンドロン|セコイア]]の木で覆われた[[セコイア国立公園]]、貯水量で州内最大の淡水湖[[タホ湖]]がある。
+
+シエラネバダ山脈の東には渡り鳥の生息地[[オーエンズヴァレー]]と[[モノ湖]]がある。州西部には水面積で州内最大のクリア湖がある。タホ湖の方が大きいがカリフォルニア州とネバダ州の州境で分けられている。シエラネバダ山脈は冬季に北極並みの気温まで下がり、アメリカ合衆国では一番南にあるパリセイド氷河なろ、多くの小さな氷河も残っている。
+
+州内陸地表面積の約45%は森林で覆われており、アラスカ州を除けばアメリカ合衆国の州で最も森林の多い州である。松類の多様さは他の州に無いものである。カリフォルニアホワイト山地の樹木の多くは世界最古のものである。ブリストルコーン松の場合は樹齢4,700年のものがある。
+
+南部には大きな内陸塩湖であるサルトンシーがある。中南部の砂漠はモハーヴェ砂漠と呼ばれている。その北東にデスバレーがあり、北アメリカでは最も低く、最も暑い地点、バッドウォーター・ベースンを含んでいる。デスバレーの最低地点からホイットニー山の最高地点までの距離は200マイル (320 km) に満たない。南東部の大半は乾燥して暑い砂漠であり、夏季には極端に高い温度を記録することが多い。
+
+カリフォルニア州海岸に沿って、大ロサンジェルス、サンフランシスコ・ベイエリア、サンディエゴなど幾つかの大都市圏が並んでいる。
+
+カリフォルニア州は[[環太平洋火山帯]]の一部であり、[[津波]]、[[洪水]]、[[旱魃]]、サンタアナ風(偏西風)、[[山火事]]、[[地すべり]]および幾つかの[[火山]]活動など自然災害が多い。南部から西部にかけての[[サンアンドレアス断層]]など幾つかの[[断層]]のために地震が多い。
+
+[[ヨセミテ国立公園]]、[[デスヴァレー国立公園]]など特徴のある著名な[[アメリカの国立公園制度|国立公園]]が随所にあり、年中多くの人々を楽しませている。
+
+州土は日本全土より約46000km&amp;sup2;([[北海道]]の約半分程度)ほど大きい。
+
+=== 気候 ===
+[[ファイル:BIGSUR CA9.jpg|thumb|right|ビッグサーの海岸線]]
+気候は主にまばゆい太陽が輝き乾燥した夏と冷涼で雨の多い冬の[[地中海性気候]]の地域が多く、また[[亜寒帯気候]]に入る地域まである。冷たい[[カリフォルニア海流]]のために海岸近くで霧が発生することが多い。降水量は多くなく、[[シエラネバダ山脈]]に降った雪解け水の[[伏流水]]を井戸で汲み上げているところが多い。しかし急激な人口増加で新たな水源の確保が課題となっている。
+
+州の形状や長い海岸線、高低差などのために、州の南端と北端または海岸部と内陸部ではかなり気温や気候が異なることがある。内陸部では寒い冬と暑い夏がある。そのため、南部の海岸で[[サーフィン]]をする人がいる一方、内陸の山地帯では[[スキー]]をする人がいたりもする。
+
+州北部は南部よりも年間降水量が多い。山岳部も気候に影響する。州内で雨の多い場所は山岳の西側斜面である。北西部は温暖な気候であり、セントラルヴァレーは地中海性気候だが海岸部よりも温暖差が激しい。シエラネバダ山脈など高山では、冬は雪の多い山岳気候であり、夏は比較的過ごしやすい暑さになる。
+
+山岳部の東側は[[雨蔭]]となり、広大な砂漠を生んでいる。東部の高度が高い砂漠では夏に暑く冬は寒いが、南部山岳の東にある低地砂漠は暑い夏とほとんど霜の降りない温暖な冬となる。海面より低い所が広がるデスバレーは北アメリカで最も暑い場所と考えられている。1913年7月10日に西半球での最高温度134°F (57 ℃) を記録した。
+[[ファイル:CalaverasBigTrees2.jpg|thumb|right|180px||カラベラス大木州立公園]]
+
+=== 生態 ===
+カリフォルニアは世界でも最も豊かで最も多様な地域の一つであり、最も絶滅が危惧される生態系も幾つかある。[[生物地理区]]では[[新北区]]に属し、多くの[[エコリージョン|生物地理学的地域]]に跨っている。
+
+カリフォルニアには数多い[[固有種]]がおり、カタリーナ・アイアンウッド(''Lyonothamnus floribundus'')のような、他所では死に絶えた遺存種が残っている。カリフォルニア・ライラック(''Ceanothus'')のように多様な生息条件を利点にして、共通の祖先から多くの種が派生した[[分化]]あるいは[[適応放散]]によって発生した固有種が多い。カリフォルニアの固有種の多くは、[[都市化]]、[[伐採]]、[[放牧|過放牧]]および[[外来種]]の導入がその生息地に侵入することで絶滅が危惧されている。
+
+カリフォルニの植物相の集合には幾つか最上級のものがある。最大の樹木(セコイアデンドロン)、最高の樹木(セコイア)および最古の樹木(ブリストルコーン松)である。野草は多年生植物である&lt;ref name="Restoring Native Grasses"&gt;{{cite journal |url=http://www.ars.usda.gov/is/AR/archive/may04/grass0504.htm |title=Restoring California's Native Grasses |journal=Agricultural Research magazine |author=David Elstein |month=May |year=2004 |volume= 52 |issue= 5 |pages=17 |accessdate=December 25, 2009}}&lt;/ref&gt;。ヨーロッパ人が到来して以降、これらは概してヨーロッパの一年草外来種に置き換わってきた。現代ではカリフォルニアの丘陵は夏に特徴ある金茶色に変わる。
+
+=== 河川 ===
+カリフォルニア州内の最も著名な河川は[[サクラメント川]]、ピット川およびサンホアキン川である。どれもシエラネバダ山脈の西斜面からセントラルヴァレーを流れ、[[サンフランシスコ湾]]を通って[[太平洋]]に流れ入る。その他重要な河川は北部の[[クラマス川]]とトリニティ川、南東部州境の[[コロラド川]]である。[[オーエンズ川]]はシエラネバダ山脈の南東斜面から流れ出て[[オーエンズ湖]]に流れ込んでいる。イール川とサリナス川はそれぞれサンフランシスコ湾の北と南で海岸に注いでいる。モハーヴェ川はモハーヴェ砂漠の主要水路であり、サンタアナ川はトランスバース山脈から流れ出て州南部を横切っている。
+
+== 人口動勢 ==
+=== 人口 ===
+[[ファイル:California population map.png|thumb|left|カリフォルニア州の人口密度分布図]]
+{{歴史的人口
+|1850|92597
+|1860|379994
+|1870|560247
+|1880|864694
+|1890|1213398
+|1900|1485053
+|1910|2377549
+|1920|3426861
+|1930|5677251
+|1940|6907387
+|1950|10586223
+|1960|15717204
+|1970|19953134
+|1980|23667902
+|1990|29760021
+|2000|33871648
+|2009年推計&lt;ref name="popEstChanges"/&gt;|36961664
+}}
+[[2009年]]現在、その人口は36,961,664人と推計され、国内で13番目に増加率の高い州である。前回2000年の国勢調査から3,090,016人増えており、自然増(出生5,058,440、死亡2,179,958&lt;ref name="popEstChanges"&gt;{{Cite web | url = http://www.census.gov/popest/states/tables/NST-EST2009-04.csv  | format = CSV | title = Table 4. Cumulative Estimates of the Components of Resident Population Change for the United States, Regions, States, and Puerto Rico: April 1, 2000 to July 1, 2009 | publisher = United States Census Bureau|
+  | date = December 22, 2009 | accessdate = December 26, 2009}}&lt;/ref&gt;)並びに州内への移住者純増306,925人が含まれている。アメリカ合衆国外からの移住で1,816,633人増加し、合衆国内部への移住で1,509,708人減少した&lt;ref name="popEstChanges"/&gt;。
+
+カリフォルニア州は最も人口の多い州であり、アメリカ合衆国人口の12%を占める。人口においてアメリカの上位50都市の8都市を有している。ロサンゼルスは人口3,833,995人(2008年推計&lt;ref&gt;{{cite web| url = http://www.census.gov/popest/cities/files/SUB-EST2007-6.csv| title = Subcounty population estimates: California 2000–2007| format = [[comma-separated values|CSV]]| publisher = United States Census Bureau, Population Division| date = 2009-03-18| accessdate = 2009-05-10}}&lt;/ref&gt;)と合衆国内で2番目の大都市である。以下、サンディエゴ(7位)、サンノゼ(10位)、サンフランシスコ(12位)、フレズノ(36位)、サクラメント(37位)、ロングビーチ(38位)、オークランド(44位)と続く。ロサンゼルス郡 (カリフォルニア州)ロサンゼルス郡の人口は9,862,049人とアメリカ合衆国の郡では最大であり、国内42の州よりも多い&lt;ref name="LA County DPSS"&gt;{{Cite web
+  | title = About Los Angeles County Department of Public Social Services
+  | publisher = Los Angeles County Department of Public Social Services
+  | year = 2005 | month = December
+  | url = https://dpss.lacounty.gov/dpss/about_dpss/dpss_overview.cfm
+  | accessdate = December 26, 2009}}&lt;/ref&gt;&lt;ref name="Baby Slump In L.A. County"&gt;{{Cite news 
+  | last = Barrett
+  | first = Beth
+  | title = Baby Slump In L.A. County
+  | newspaper = Los Angeles Daily News
+  | pages = N4
+  | publisher = Los Angeles Newspaper Group
+  | date = September 19, 2003
+  | url = http://www.redorbit.com/news/science/7215/baby_slump_in_la_county/index.html
+  | accessdate = December 26, 2009}}&lt;/ref&gt;。州の[[人口重心]]はバトンウィロウ(国勢調査指定地域)がある、[[カーン郡 (カリフォルニア州)|カーン郡]]となっている&lt;ref&gt;座標でいえば、{{Coord|35.458606|-119.355165|display=inline}}&lt;/ref&gt;&lt;ref name="popCentersByState"&gt;{{Cite web
+  | title = Population and Population Centers by State: 2000
+  | work = United States Census 2000
+  | publisher = US Census Bureau Geography Division
+  | date = May 20, 2002
+  | url = http://www.census.gov/geo/www/cenpop/statecenters.txt
+  | format = TXT
+  | accessdate = December 26, 2009}}&lt;/ref&gt;。
+
+=== 人種構成 ===
+アメリカ合衆国統計局は、自分や先祖が中南米のスペイン語圏出身であるという意識を持つ[[ヒスパニック|ヒスパニック系]]を2つのカテゴリー分けている。ヒスパニック系は「ヒスパニック」だけではなく、[[白人]]または[[アジア系民族|アジア系]]に分類される場合、単純に「その他の人種」と分類される場合がある。そのために[[国勢調査]]データが分かりにくいと言われている。
+
+下記は「ヒスパニック系」を明確に分類し、各グループのヒスパニック系以外の数値(ヒスパニック系以外の白人、ヒスパニック系以外の[[エスキモー]]、ヒスパニック系以外の[[混血]]など)を掲載した(人種及び国勢調査上のもっと多くの情報についてはこのウェブサイトを参照のこと:[http://en.wikipedia.org/wiki/Race_%28U.S._Census%29])。
+
+{| class="wikitable"
+|-
+!
+!2000年国勢調査 [http://www.census.gov/popest/states/asrh/tables/SC-EST2003-03/SC-EST2003-03-28.pdf]&lt;/td&gt;
+!2008年推計 &lt;ref name="CensusQuickFacts"&gt;{{Cite web
+  | title = California QuickFacts from the US Census Bureau:
+  | publisher = US Census Bureau
+  | url = http://quickfacts.census.gov/qfd/states/06000.html
+  | accessdate = December 26, 2009}}&lt;/ref&gt;&lt;/td&gt;
+|-
+|ヒスパニック以外の白人
+|47.4%
+|42.3%
+|-
+|[[ラティーノ]](人種を問わない[[ヒスパニック]])
+|32.4%
+|36.6%
+|-
+|アジア系アメリカ人
+|11.0%
+|12.5%
+|-
+|[[アフリカン・アメリカン|黒人]]
+|6.5%
+|6.7%
+|-
+|2つまたはそれ以上の[[人種]]
+|1.9%
+|2.6%
+|-
+|[[インディアン]]及び [[エスキモー]]
+|0.5%
+|1.2%
+|-
+|[[ハワイ諸島]]及び[[太平洋諸島]]系[[先住民族]]
+|0.3%
+|0.3%
+|}
+白人の数では22,189,514人と国内最大の州であり、アフリカ系アメリカ人は2,250,630人と国内5位である。アジア系アメリカ人は440万人と推計され、国内のアジア系人口1,310万人の約3分の1がカリフォルニア州に住んでいることになる。インディアン人口は285,162人でこれも国内最高である&lt;ref name="US Census Cal Race and Ethnicity"&gt;{{Cite web
+  | title = California - ACS Demographic and Housing Estimates: 2006-2008
+  | work = American Fact Finder
+  | publisher = US Census Bureau
+  | url = http://factfinder.census.gov/servlet/ADPTable?_bm=y&amp;-geo_id=04000US06&amp;-qr_name=ACS_2008_3YR_G00_DP3YR5&amp;-ds_name=ACS_2008_3YR_G00_&amp;-_lang=en&amp;-_sse=on
+  | accessdate = December 26, 2009}}&lt;/ref&gt;。
+
+カリフォルニア州内の民族は、メキシコ系 (25%) であり、次にアジア系、[[イギリス]]系、[[ドイツ]]系、及び[[アイルランド]]系と続く。メキシコ系特に[[チカーノ]]の多くは、カリフォルニア州南部、セントラルヴァレー、サリナス、及びサンフランシスコ湾地域に居住している。イギリス系の白人[[アングロ・サクソン人|アングロサクソン]]民族の多くは、シエラネバダ東部、北縁、及び北部海岸に居住している。カリフォルニアはもとより、[[北アメリカ|北米]]でアジア系が最も集中しているのが、サンフランシスコ近辺である。
+
+=== 言語 ===
+[[2005年]]現在、5歳以上のカリフォルニア州民の、57.59%は家庭で[[英語]]を話し、28.21%は[[スペイン語]]を話している。以下、[[タガログ語]]2.04%、[[中国語]]1.59%、[[ベトナム語]]1.4%、及び[[韓国語]]1.05%と続く。全体で42.4%は英語以外を話している&lt;ref name="MLA Languages"&gt;{{Cite web
+  | title =  Most spoken languages in California in 2005
+  | publisher = Modern Language Association
+  | url = http://www.mla.org/map_data_results&amp;state_id=6&amp;county_id=&amp;mode=state_tops&amp;zip=&amp;place_id=&amp;cty_id=&amp;ll=&amp;a=&amp;ea=&amp;order=r
+  | accessdate = December 27, 2009}}&lt;/ref&gt;&lt;ref name="Languages at Home US Census"&gt;{{Cite web
+  | title = Table 5. Detailed List of Languages Spoken at Home for the Population 5 Years and Over by State: 2000
+  | work = Census 2000  | publisher = US Census Bureau  | date = February 27, 2003
+  | url = http://www.census.gov/population/cen2000/phc-t20/tab05.pdf  | format = PDF  | accessdate = December 27, 2009}}&lt;/ref&gt;カリフォルニアは世界でも最も言語的に多様な地域と見られている。
+
+選挙公報、確定申告など公的文書にもスペイン語表記があるため、[[アメリカ合衆国|国]]や州の[[公用語]]だと誤解しがちである。しかしアメリカに公用語はなく、英語が実質上の[[国語]]とされているのみである。一方、約30州が州の公用語を定めており、カリフォルニア州では[[1986年]]の州法改定で、共通語であり公用語であるのは英語である旨を明文化している&lt;ref&gt;[http://www.leginfo.ca.gov/.const/.article_3 California Constitution article 3 sec.6] カリフォルニア州法 (原文)&lt;/ref&gt;&lt;ref&gt;[[:en:English-only movement|English-only movement]] 英語版記事 2007年9月19日 17:48UTC版&lt;/ref&gt;。
+
+2009年10月24日、シュワルツェネッガー知事は、チュマシュ族インディアン・サンタイネス・バンドを筆頭とするカリフォルニア・インディアン部族の提唱した、インディアン部族語の保存援助を目的とする新しい州法案に署名した。州のこの新法は、同州のインディアン部族に、部族語再教育のためのライセンスや各種基準を認めるものである。同州にはかつて100以上の部族語が存在したが、「[[インディアン寄宿学校]]」による合衆国の[[民族浄化]]政策によって、半数以上が絶滅言語となってしまっている。
+
+=== 宗教 ===
+[[ファイル:San Jose Basilica.jpg|thumb|Cathedral[[サンノゼ]]のセントジョセフ・バシリカ]]
+カリフォルニア州の住民の宗教は以下の通り。
+* [[キリスト教]] – 75%
+** [[プロテスタント]] – 38%
+*** [[バプテスト教会|バプテスト]] – 8%
+*** [[長老派教会]] – 3%
+*** [[メソジスト]] – 2%
+*** [[ルーテル教会]] – 2%
+*** 他のプロテスタントまたは一般的なプロテスタント – 23%
+** [[カトリック教会|ローマ・カトリック]] – 34%
+** 他のキリスト教 – 3%
+* [[ユダヤ教]] – 2%
+* その他の宗教 – 3%
+* 無宗教 – 20%
+
+多くの他の西部の州と同じく、カリフォルニア州でも[[無宗教]]の比率が合衆国の他の地域に比して高い。
+
+== インディアン部族 ==
+[[ファイル:Americanindiansmapcensusbureau.gif|250px|left|thumb|カリフォルニア州のインディアン保留地]]
+同州にはかつて、60を数える[[インディアン]]部族が先住していた。温暖な気候と豊富な漁業・狩猟資源に恵まれ、農業は発展しなかった。
+
+18世紀にやってきたスペイン人は、様々な部族のインディアンを捕えて強制的にキリスト教化し、農場の労務や他のインディアン部族の監督に使役し、これを「[[w:Mission Indians|ミッション・インディアン]](伝道インディアン)」と呼んだ。現在、カリフォルニア独自のインディアン集団となっている。
+
+1849年を中心とする[[ゴールド・ラッシュ]]では、金目当てにやってきた白人(フォーティーナイナー)が北部のインディアン部族の土地を蹂躙した。[[ヤヒ|ヤヒ族]]のように根絶やしにされた部族もあった。
+
+同州は、インディアンによる初の完全自治運営による短期大学「[[DQ大学]]([[w:D-Q University|D-Q University]])」が開校された記念すべき州でもある。この学校は、朝鮮戦争時に連邦政府に没収され、ミサイルレーダー基地にされていたインディアン保留地が以後放置されていたものを返還させ跡地利用したものである。現在、州はこの大学の認定を取り消して廃校処分としており、インディアン学生による抗議運動が続けられている。
+
+1960年代に巻き起こったインディアンの権利回復要求運動「レッド・パワー運動([[:w:Red Power movement|Red Power movement]])」では、全米でインディアンによる占拠抗議が行われた。同州で決行された[[アルカトラズ島占拠事件]]は、中でも最大級のものであった。
+[[ファイル:Alcatraz Island 01 Prison sign.jpg|right|thumb|インディアンによるアルカトラズ島占拠の記念碑]]
+1969年の11月20日、[[モホーク族]]の[[:w:Richard Oakes (activist)|リチャード・オークス]]、サンテ・[[スー族]]の[[:w:John Trudell|ジョン・トラデル]]ら老若男女79人のインディアンたちが[[アルカトラズ島]]に上陸、条約に基づく権利として「アルカトラズ島をインディアンの文化センターとする」と宣言、数百人のインディアンが全米から集まった。[[リチャード・ニクソン]]大統領が調停に入り、「レッド・パワー運動」は全世界に轟いた。占拠は1971年6月11日まで続いた。
+
+小規模部族が多く、同州では「[[インディアン居留地|保留地]](Reservation)」は主に「集落(Rancheria)」と呼ばれている。温暖な気候を利用し、果樹園を営む部族もあり、日本にも果実が輸入されている。リゾート観光事業に特化した部族も多いが、ほとんどの部族は産業を持てず貧困にあえぐ状況である。
+
+[[ファイル:Emeryfromhilton.jpg|left|thumb|サンフランシスコの観光名所であるショッピング・センター「ベイ・ストリート・モール」は、ムウェクマ・オーロネ族の伝統墓地と貝塚を破壊して建てられた]]
+絶滅扱いされ、部族認定されていない[[サンフランシスコ]]の「[[オーロネ族]]・ムウェクマ・バンド」は、部族伝統の墓地と貝塚を破壊されて、ショッピングセンター「[[w:Bay Street Emeryville|ベイ・ストリート・モール]]」を建てられた。部族の反対を押し切って行われた墓暴きでは、女性首長ローズマリー・ギャンブラが妨害行為を行ったとして逮捕された。発掘されたオーロネ族の数万個に上る遺骨片は、バークレー大学のインディアン博物館に押収展示されており、部族はこの返還を求め係争中である。
+
+[[ファイル:Klamath tribes dam removal demo.jpg|thumb|right|クラマス族による水利漁業権回復要求デモ(2006年)]]
+同州を流れる[[クラマス川]]には、上流に鮭の遡上を遮る四つのダムがあり、伝統的な鮭漁が営めないとして、[[クラマス族]]、[[ユロク族]]はダムの撤廃を訴え、2004年と2005年にダムを所有する実業家の住む[[スコットランド]]へ赴き、現地で熱狂的に迎えられた。この際に魚道の確保や一部ダムの撤廃などを約束されたが、2006年にダムの所有者が移ったため、運動は振り出しに戻っている。また、[[カルク族]]はクラマス川で行われている砂金採りのレクリエーションイベントが河床を荒らし、鮭漁に有害であると抗議している。2009年1月、カリフォルニア漁業狩猟庁はこれが特別「非常事態」でもないとして却下した。カルク族のクレイグ・タッカーは「我々の漁場が非常事態でないと思うんなら、そいつらは頭のスイッチがいかれてるんだろう」とコメントした。
+
+同州には19世紀に東部や南部から強制移住させられた部族もおり、多数の部族が現在、連邦政府の公式認定を要求し、係争中である。
+
+{{Main|カリフォルニア州のインディアン部族一覧}}
+
+===インディアン・カジノ===
+1987年、「ミッション・インディアン・カバゾン・バンド」が部族の命運をかけて開設した高額賭け率のビンゴ場の「ファンタジー・スプリングス・リゾート・カジノ」は、これを違法とする州政府と「[[w:California v. Cabazon Band|カリフォルニア州対ミッション・インディアン・カバゾン・バンド]]」と呼ばれる法廷闘争の末、最高裁で合法判決を勝ち取った。この判例は全米のインディアン部族に部族カジノ開設を競わせ、「インディアン・カジノ」は「現代のバッファロー」と呼ばれる部族のビジネス・モデルとなった。
+
+1988年、アメリカ連邦政府は「インディアン賭博規制法」を制定し、インディアン部族による賭博を三等級に分け、最上級のカジノ運営に関し、連邦認定された(つまり、保留地を所有する)インディアン部族に限って内務省管轄でこれを認めることとした。一方、同じインディアン部族でありながらアメリカ連邦政府から「絶滅部族」とされ、連邦との条約規定を解消されて保留地や福利厚生の権利を没収された多数のバンドは、カジノを持つことも出来ず、自立の機会を奪われている。
+
+現在、カリフォルニア州のインディアン部族は、同州全体で58のカジノと、90のポーカー場を運営している。「宮殿」を名乗るカジノもあるが、実際に宮殿並みの外観を備え、ホテル、温泉や保養施設、レストランなどを揃えた一大リゾート施設となったものも多い。
+
+同州のインディアン部族経営のカジノ・賭博施設については[[カリフォルニア州のインディアン・カジノ一覧]]を参照。
+
+== 重要な都市及び町 ==
+&lt;gallery&gt;
+ファイル:Sacramento from Riverwalk.jpg|サクラメント
+ファイル:DowntownLosAngeles.jpg|ロサンゼルス
+ファイル:Sandiego.arp.750pix.jpg|サンディエゴ
+ファイル:Lightmatter sanfrancisco.jpg|サンフランシスコ
+ファイル:SanJoseDowntownIMG016elf wb.jpg|サンノゼ
+ファイル:Long Beach, CA at night.jpg|ロングビーチ
+ファイル:Oakland California skyline.jpg|オークランド
+ファイル:Downtownfresno.jpg|フレズノ
+&lt;/gallery&gt;
+カリフォルニア州は大都市圏内に大多数が属する、480都市を有している(市が458、町が22。カリフォルニアの州法では市も町も明確な区別は無く、どちらを選んでもよい&lt;ref name="Cal Gov Code 34502"&gt;{{Cite web
+  | title = CA Codes (gov:34500-34504)
+  | publisher = California State Senate
+  | url = http://info.sen.ca.gov/cgi-bin/displaycode?section=gov&amp;group=34001-35000&amp;file=34500-34504
+  | accessdate = January 29, 2010}}&lt;/ref&gt;)。カリフォルニア州の人口の68%は、ロサンゼルス大都市圏、[[サンフランシスコ・ベイエリア|サンフランシスコ湾岸地域]]及びリバーサイド・サンバーナーディーノの3大都市圏に住んでいる。その他に規模は小さくなるがサンディエゴとサクラメントの都市圏にもそこそこの人口が集まっている。
+
+サクラメントが1850年に市政を布いたのが最初の市になった&lt;ref name="Sacramento Charter"&gt;{{cite web|url=http://www.library.ca.gov/goldrush/sec08.html|title=Instant City: Sacramento|publisher=California State Library|accessdate=January 29, 2010}}&lt;/ref&gt;サンノゼ、サンディエゴおよびベニシアが同年3月27日に続いた&lt;ref name="San Jose Inc"&gt;{{cite web|url=http://www.sanjoseca.gov/about.asp |title=San Jose at a Glance |publisher=City of San Jose |accessdate= January 29, 2010}}&lt;/ref&gt;&lt;ref name="History of San Diego"&gt;{{cite web |title=A History of San Diego Government |url=http://www.sandiego.gov/city-clerk/geninfo/history.shtml |publisher=City of San Diego |accessdate=January 29, 2010}}&lt;/ref&gt;&lt;ref name="Benicia Inc"&gt;{{Cite web | title = California State Parks: 1846 to 1854 | publisher = California State Parks
+  | date = May 23, 2007 | url = http://www.parks.ca.gov/?page_id=1096 | accessdate = January 29, 2010}}&lt;/ref&gt;。 2008年10月1日に市になったメニフィーが最新で480番目である&lt;ref&gt;{{Cite news 
+  | last = McKinnon | first = Julissa
+  | title = Menifee celebrates cityhood
+  | newspaper = The Press-Enterprise | publisher = Press-Enterprise Company
+  | date = October 2, 2008 | url = http://www.pe.com/localnews/inland/stories/PE_News_Local_S_sinauguration02.2188d3d.html
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。
+
+カリフォルニア州はチャーターと一般法の2種の市を認めている&lt;ref name="Cal Gov Code 34502"/&gt;。一般法の市は州法でその存在を認められ、州の管轄を受ける。チャーター市は市自体のチャーターで統治される。19世紀に市政を布いた市はチャーター市が多かった。人口の多い10都市も全てチャーター市である。
+{|
+|-
+|valign=top|
+{| class="wikitable" style="text-align:right; margin-left:60px"
+|-
+! 順位 !! align=center |都市 !! 人口&lt;br/&gt;&lt;small&gt; within&lt;br/&gt;city limits&lt;/small&gt; !! 面積&lt;br/&gt;&lt;small&gt; sq. miles&lt;/small&gt; !! 人口&lt;br/&gt;密度&lt;br/&gt;&lt;small&gt; per sq mi&lt;/small&gt; !! 郡
+|-
+| 1 ||align=left | [[ロサンゼルス]] || '''3,976,071''' || 469.1 || 7,876.8 || [[ロサンゼルス郡 (カリフォルニア州)|ロサンゼルス郡]]
+|-
+| 2 ||align=left | [[サンディエゴ]] || '''1,305,736''' || 324.3 || 3,771.9 || [[サンディエゴ郡 (カリフォルニア州)|サンディエゴ郡]]
+|-
+| 3 ||align=left | [[サンノゼ]] || '''945,000''' || 174.9 || 5,117.9 || [[サンタクララ郡 (カリフォルニア州)|サンタクララ郡]]
+|-
+| 4 ||align=left | [[サンフランシスコ]] || '''799,263''' || 46.7 || 16,634.4 || [[サンフランシスコ郡 (カリフォルニア州)|サンフランシスコ郡]]
+|-
+| 5 ||align=left | [[ロングビーチ (カリフォルニア州)|ロングビーチ]] || '''491,564''' || 50.5 || 9,149.8 || ロサンゼルス郡
+|-
+| 6 ||align=left | [[フレズノ]] || '''464,727''' || 104.4 || 4,097.7 || [[フレズノ郡 (カリフォルニア州)|フレズノ郡]]
+|-
+| 7 ||align=left | [[サクラメント (カリフォルニア州)|サクラメント]] || '''452,959''' || 97.2 || 4,189.2 || [[サクラメント郡 (カリフォルニア州)|サクラメント郡]]
+|-
+| 8 ||align=left | [[オークランド (カリフォルニア州)|オークランド]] || '''412,318''' || 56.1 || 7,126.6 || [[アラメダ郡]]
+|-
+| 9 ||align=left | [[サンタアナ (カリフォルニア州)|サンタアナ]] || '''351,697''' || 27.1 || 12,451.9 || [[オレンジ郡 (カリフォルニア州)|オレンジ郡]]
+|-
+|10 ||align=left | [[アナハイム]] || '''345,317''' || 48.9 || 6,702.0 || オレンジ郡
+|}
+&lt;br clear=left /&gt;
+{| class="wikitable" style="text-align:right; margin-left:60px"
+|-
+! 順位 !! align=center |郡 !! 人口&lt;br/&gt;&lt;small&gt; within&lt;br/&gt;county limits&lt;/small&gt; !! 面積&lt;br/&gt;&lt;small&gt; sq. miles&lt;/small&gt; !! 人口&lt;br/&gt;密度&lt;br/&gt;&lt;small&gt; per sq mi&lt;/small&gt; !! 最大都市
+|-
+| 1 ||align=left | ロサンゼルス郡 || '''10,245,572''' || 4,061 || 2,344 || ロサンゼルス
+|-
+| 2 ||align=left | オレンジ郡 || '''3,072,336''' || 789 || 3,606 || サンタアナ
+|-
+| 3 ||align=left | サンディエゴ郡 || '''3,066,820''' || 4,200 || 670 || サンディエゴ
+|-
+| 4 ||align=left | [[サンバーナーディーノ郡]] || '''1,991,829''' || 20,052 || 85 || [[サンバーナーディーノ (カリフォルニア州)|サンバーナーディーノ]]
+|-
+| 5 ||align=left | [[リバーサイド郡 (カリフォルニア州)|リバーサイド郡]] || '''1,953,330''' || 7,207 || 214 || [[リバーサイド (カリフォルニア州)|リバーサイド]]
+|-
+| 6 ||align=left | サンタクララ郡 || '''1,773,258''' || 1,291 || 1,304 || サンノゼ
+|-
+| 7 ||align=left | アラメダ郡 || '''1,510,303''' || 738 || 732 || オークランド
+|-
+| 8 ||align=left | サクラメント郡 || '''1,385,607''' || 966 || 1,267 || サクラメント
+|-
+| 9 ||align=left | [[コントラコスタ郡 (カリフォルニア州)|コントラコスタ郡]] || '''1,029,377''' || 720 || 492 || [[コンコード (カリフォルニア州)|コンコード]]
+|-
+|10 ||align=left | フレズノ郡 || '''899,514''' || 5,963 || 134 || フレズノ
+|}
+&lt;br clear=left /&gt;
+&lt;small&gt;'''注釈:表は人口に[http://www.dof.ca.gov/HTML/DEMOGRAP/e-1press.pdf 2006年]度カリフォルニア州概算及び地域並びに密度に[[:en:United States Census, 2000|2000年国勢調査]]を使用して編集した。''' &lt;/small&gt;
+
+上の地域内の重要な郊外の一覧、参照:[[:en:List of urbanized areas in California (by population)]]。
+: 参照:[[:en:List of cities in California|List of cities in California]] 及び [[:en:List of cities in California (by population)]]
+: 参照:[[カリフォルニア州の郡一覧]]
+
+=== カリフォルニア州内の25の豊かな場所 ===
+以下のリストは住人の平均個人所得による順位である:
+
+# [[ベルヴェディア (カリフォルニア州)]] - [[マリン郡 (カリフォルニア州)|マリン郡]] - $113,595
+# [[ランチョサンタフェ (カリフォルニア州)]] - [[サンディエゴ郡 (カリフォルニア州)|サンディエゴ郡]] - $113,132
+# [[アサートン (カリフォルニア州)]] - [[サンマテオ郡 (カリフォルニア州)|サンマテオ郡]] - $112,408
+# [[ローリングヒルズ (カリフォルニア州)]] - [[ロサンゼルス郡 (カリフォルニア州)|ロサンゼルス郡]] - $111,031
+# [[ウッドサイド (カリフォルニア州)]] - サンマテオ郡 - $104,667
+# [[ポートラヴァレー (カリフォルニア州)]] - サンマテオ郡 - $99,621
+# [[ニューポートコースト (カリフォルニア州)]] - オレンジ郡 - $98,770
+# [[ヒルズボロー (カリフォルニア州)]] - サンマテオ郡 - $98,643
+# [[ディアブロ (カリフォルニア州)]] - [[コントラコスタ郡 (カリフォルニア州)|コントラコスタ郡]] - $95,419
+# [[フェアバンクスランチ (カリフォルニア州)]] - [[サンディエゴ郡 (カリフォルニア州)|サンディエゴ郡]] - $94,150
+# [[ヒドゥンヒルズ (カリフォルニア州)]] - ロサンゼルス郡 - $94,096
+# [[ロスアルトスヒルズ (カリフォルニア州)]] - [[サンタクララ郡 (カリフォルニア州)|サンタクララ郡]] - $92,840
+# [[ティブロン (カリフォルニア州)]] - マリン郡 - $85,966
+# [[サウサリート]] - マリン郡 - $81,040
+# [[モンテセラーノ (カリフォルニア州)]] - サンタクララ郡 - $76,577
+# [[インディアンウェルズ (カリフォルニア州)]] - [[リバーサイド郡 (カリフォルニア州)|リバーサイド郡]] $76,187
+# [[マリブ (カリフォルニア州)]] - ロサンゼルス郡 - $74,336
+# [[デルモンテフォレスト (カリフォルニア州)]] - [[モントレー郡 (カリフォルニア州)|モントレー郡]] - $70,609
+# [[ピードモント (カリフォルニア州)]] - [[アラメダ郡]] - $70,539
+# [[モンテシート (カリフォルニア州)]] - [[サンタバーバラ郡]] - $70,077
+# [[パロスヴァーディスエステイツ (カリフォルニア州)]] - ロサンゼルス郡 - $69,040
+# [[エメラルドレイクヒルズ (カリフォルニア州)]] - サンマテオ郡 - $68,966
+# [[ロヨーラ (カリフォルニア州)]] - サンタクララ郡 - $68,730
+# [[ブラックホークカミーノテッサジャラ (カリフォルニア州)]] - コントラコスタ郡 - $66,972
+# [[ロスアルトス (カリフォルニア州)]] - サンタクララ郡 - $66,776
+
+[[:en:California locations by per capita income|''カリフォルニア州の場所の平均個人所得ランキング'']]
+
+[[2000年]]の調査によると、マリン郡はアメリカ合衆国内で最も豊かな郡である。
+
+== 法律及び行政 ==
+=== 州政府 ===
+[[ファイル:Sacramento Capitol.jpg|thumb|right|200px|サクラメントにあるカリフォルニア州議会議事堂]]
+カリフォルニア州は[[共和制]]の[[権力分立|三権分立制]]を採っている。すなわち知事とその他選挙で選ばれる憲法で定めた行政官からなる執行府、下院と上院からなる立法府および最高裁判所と下級裁判所からなる司法府である。また直接請求、[[住民投票]]、[[リコール (地方公共団体)|リコール]]および[[批准]]という手段で有権者が直接政治に参加できる仕組みがある。政党は閉鎖的[[予備選挙]]あるいは党員と無所属の者のみが投票できる予備選挙のどちらかを選択できる。
+
+知事とその他選挙で選ばれる憲法で定めた行政官の任期は4年間であり、再選は1回のみ可能である。州議会は上院が定数40人、下院が80人である。上院は4年任期、下院は2年任期である。下院議員は3期まで、上院議員は2期までという上限がある。
+
+2007年-2008年の会期では、下院が民主党議員48人、共和党議員32人、上院が民主党議員25人、共和党議員15人となっていた。知事は共和党のアーノルド・シュワルツェネッガーである。
+
+カリフォルニアの法体系は明確にイギリスの[[コモン・ロー]]に基づいている&lt;ref name="Cal Civil Code 22.2"&gt;{{Cite web
+  | title = California Codes, Civil Code Section 22-22.2
+  | work = California Civil Codes
+  | publisher = Legislative Counsel of the State of California
+  | url = http://www.leginfo.ca.gov/cgi-bin/waisgate?WAISdocID=81815814163+15+0+0&amp;WAISaction=retrieve
+  | accessdate = January 29, 2010}}&lt;/ref&gt;が、夫婦共有財産のようにスペインの[[大陸法]]から継承したものもある。死刑は合法であり、現在国内最多の「処刑待ち」死刑囚を抱えている。死刑囚監房はサンフランシスコの北、[[マリン郡 (カリフォルニア州)|マリン郡]]にある[[サン・クエンティン州立刑務所]]にある。人権問題が提起されているので、死刑執行は現在無期限に止められている。&lt;ref name="Sarhaddi 2006"&gt;{{Cite news 
+  | last = Sarhaddi Nelson | first = Soraya
+  | title = Morales execution on hold indefinitely
+  | newspaper = Orange County Register
+  | publisher = Freedom Communications
+  | date = February 21, 2006
+  | url = http://www.ocregister.com/ocregister/news/homepage/article_1008434.php
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。州内の刑務所に居る受刑者の数は1980年の25,000人から2007年の17万人以上にまで膨れ上がっている&lt;ref name="Thompson 2007"&gt;{{Cite news 
+  | last = Thompson | first = Don
+  | title = Calif. Struggles with sentencing reform
+  | newspaper = USA Today | publisher = Gannett Company
+  | date = December 8, 2007 | url = http://www.usatoday.com/news/nation/2007-12-08-2244622424_x.htm
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。
+カリフォルニア州の司法府は合衆国の州の中で最大であり、判事が1,600人居る(連邦司法府は約840人に過ぎない)。最高裁判所の判事は7人である。最高裁判所と控訴裁判所の判事は知事によって指名されるが、12年ごとに有権者の審査を受けることになっている。
+
+全米10大都市にランクされるロサンゼルスやサンフランシスコなどの大都市圏をかかえるカリフォルニア州は、かつての[[大気汚染]]などの問題もあり、[[製造業|メーカー]]等の[[産業廃棄物]]処理・排水規制などの[[法人]]対象の法や、[[ベルモント (カリフォルニア州)|ベルモント市]]の[[2009年]]より個人所有のアパートなどを含む共有空間での[[喫煙]]を禁じる条例など、早期から取り締まられた[[排気ガス]]規制など環境関連の規制が全米で最も厳しい。
+
+1970年代はアメリカでもっともすばらしい政治運営がなされている場所と評価されていたが、重要な法案を州民投票で直接選択する方針を採ってからは行政運営が上手くいっておらず、かつては全米一と言われていた教育水準も年々低下している。
+
+==== 参考文献 ====
+* [[東海大学]]教授[[牧田義輝]]、「カリフォルニア州の地方自治体について」([http://www.clair.or.jp/j/forum/series/pdf/h18-1.pdf PDF版])、(財)自治体国際化協会 比較地方自治研究会、2006年
+
+=== 国政 ===
+{| align="right" border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; border: 1px #aaa solid; border-collapse: collapse; font-size: 90%;"
+|+ '''大統領選挙の結果'''
+|- bgcolor = lightgrey
+! 年
+! [[共和党 (アメリカ)|共和党]]
+! [[民主党 (アメリカ)|民主党]]
+|-
+| bgcolor="#f0f0ff"|[[2008年アメリカ合衆国大統領選挙|2008]]
+| bgcolor="#fff3f3"|   36.91%    ''5,011,781''
+| bgcolor="#f0f0ff"|'''60.94%''' ''8,274,473''
+|-
+| bgcolor="#f0f0ff"|[[2004年アメリカ合衆国大統領選挙|2004]]
+| bgcolor="#fff3f3"|   44.36%    ''5,509,826''
+| bgcolor="#f0f0ff"|'''54.40%''' ''6,745,485''
+|-
+| bgcolor="#f0f0ff"|[[2000年アメリカ合衆国大統領選挙|2000]]
+| bgcolor="#fff3f3"|   41.65%    ''4,567,429''
+| bgcolor="#f0f0ff"|'''53.45%''' ''5,861,203''
+|-
+| bgcolor="#f0f0ff"|[[1996年アメリカ合衆国大統領選挙|1996]]
+| bgcolor="#fff3f3"|   38.21%    ''3,828,380''
+| bgcolor="#f0f0ff"|'''51.10%''' ''5,119,835''
+|-
+| bgcolor="#f0f0ff"|[[1992年アメリカ合衆国大統領選挙|1992]]
+| bgcolor="#fff3f3"|   32.61%    ''3,630,574''
+| bgcolor="#f0f0ff"|'''46.01%''' ''5,121,325''
+|-
+| bgcolor="#fff3f3"|[[1988年アメリカ合衆国大統領選挙|1988]]
+| bgcolor="#fff3f3"|'''51.13%''' ''5,054,917''
+| bgcolor="#f0f0ff"|   47.56%    ''4,702,233''
+|-
+| bgcolor="#fff3f3"|[[1984年アメリカ合衆国大統領選挙|1984]]
+| bgcolor="#fff3f3"|'''57.51%''' ''5,467,009''
+| bgcolor="#f0f0ff"|   41.27%    ''3,922,519''
+|-
+| bgcolor="#fff3f3"|[[1980年アメリカ合衆国大統領選挙|1980]]
+| bgcolor="#fff3f3"|'''52.69%''' ''4,524,858''
+| bgcolor="#f0f0ff"|   35.91%    ''3,083,661''
+|-
+| bgcolor="#fff3f3"|[[1976年アメリカ合衆国大統領選挙|1976]]
+| bgcolor="#fff3f3"|'''49.35%''' ''3,882,244''
+| bgcolor="#f0f0ff"|   47.57%    ''3,742,284''
+|-
+| bgcolor="#fff3f3"|[[1972年アメリカ合衆国大統領選挙|1972]]
+| bgcolor="#fff3f3"|'''55.01%''' ''4,602,096''
+| bgcolor="#f0f0ff"|   41.54%    ''3,475,847''
+|-
+| bgcolor="#fff3f3"|[[1968年アメリカ合衆国大統領選挙|1968]]
+| bgcolor="#fff3f3"|'''47.82%''' ''3,467,664''
+| bgcolor="#f0f0ff"|   44.74%    ''3,244,318''
+|-
+| bgcolor="#f0f0ff"|[[1964年アメリカ合衆国大統領選挙|1964]]
+| bgcolor="#fff3f3"|   40.79%    ''2,879,108''
+| bgcolor="#f0f0ff"|'''59.11%''' ''4,171,877''
+|-
+| bgcolor="#fff3f3"|[[1960年アメリカ合衆国大統領選挙|1960]]
+| bgcolor="#fff3f3"|'''50.10%''' ''3,259,722''
+| bgcolor="#f0f0ff"|   49.55%    ''3,224,099''
+|}
+カリフォルニア州には特有の政治文化がある。妊娠中絶を認めた2番目の州であり、同性の結婚を認めたのも2番目だった(同性の結婚は司法判断であり、後に住民請求による投票で撤回された)。
+
+1990年代以降の国政選挙では概して民主党候補を選んでいるが、知事には共和党候補を選んできた。ただしシュワルツェネッガーのように共和党知事の多くは「中庸共和党」、中央政党より中道であると見なされる傾向がある。
+
+民主党の地盤はロサンゼルス郡やサンフランシスコ・ベイエリアなど海岸地域である。またサクラメントでも多数派である。共和党の地盤は東部である。南部の[[オレンジ郡 (カリフォルニア州)|オレンジ郡]]も共和党が強い。
+
+カリフォルニアの政治傾向は民主党が強くなり、共和党が弱くなっている。この傾向は大統領選挙で顕著である。さらに民主党は1992年以降アメリカ合衆国上院議員選挙を全て制しており、州議会の両院でも多数党である。アメリカ合衆国下院では、第110会期で民主党議員34人、共和党議員19人となっている。州内の選挙区はどちらかの政党が優位となっており、接戦になる選挙区は少ない。かつて共和党を選んでいた大変保守派の州だったが、現在は民主党優位となった。政治評論家に拠れば、下院議員および大統領選挙人の数は現在の55人よりも3人多い58人であるべきとしている&lt;ref&gt;{{Cite web
+  | last = Sabato  | first = Larry J.
+  | title = Electoral Trends Warm Sunbelt, Freeze Frostbelt | work = Sabato's Crystal Ball
+  | publisher = University of Virginia Center for Politics
+  | date = March 22, 2007 | url = http://www.centerforpolitics.org/crystalball/articles/ljs2007032201/
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。
+
+== 経済 ==
+[[ファイル:USA-World Nominal GDP.PNG|thumb|400px|カリフォルニア州が1つの国であれば、国内総生産は7位から10位の間に入る。&lt;ref name="CIA Country Comparison GDP"&gt;{{Cite web
+  | title = Country Comparison :: GDP (purchasing power parity)
+  | work = The World Factbook
+  | publisher = Central Intelligence Agency
+  | url = https://www.cia.gov/library/publications/the-world-factbook/rankorder/2001rank.html
+  | accessdate = January 31, 2010}}&lt;/ref&gt;&lt;ref name="Cal Facts 2004 State Economy"&gt;{{Cite web
+  | title = Cal Facts 2004 State Economy
+  | publisher = Legislative Analyst's Office of California
+  | date = December 3, 2004
+  | url = http://www.lao.ca.gov/2004/cal_facts/2004_calfacts_econ.htm
+  | accessdate = January 31, 2010}}&lt;/ref&gt;&lt;ref name="Cal Finance World Ranking 2003"&gt;{{Cite web
+  | title = California's World Ranking ? 2003 Gross Product
+  | publisher = California Department of Finance
+  | url = http://www.dof.ca.gov/HTML/FS_DATA/LatestEconData/Data/Miscellaneous/Bbrank.xls
+  | format = XLS
+  | accessdate = January 31, 2010}}&lt;/ref&gt;]]
+[[ファイル:Gross Domestic Product of California 2008 (millions of current dollars).svg|thumb|right|350px|カリフォルニア州のGDP産業別内訳、2008年&lt;ref name="BEA"&gt;{{cite web | title=Regional Economic Accounts (interactive tables) | work=Bureau of Economic Analysis  | url=http://www.bea.gov/bea/regional/gsp/  | accessdate=January 31, 2010}}&lt;/ref&gt;
+]]
+2007年時点で州の総生産は約1兆8,120億ドルであり、国内の州では最大で、アメリカ合衆国のGDPの13%を占めている。世界の国と比較してもGDPで9位、購買力平価説購買力平価で12位になる。しかし、2009年-2010年会計年度では263億ドルの赤字だった&lt;ref name="Yi 2009"&gt;{{Cite news 
+  | last = Yi | first = Matthew
+  | title = State's budget gap deepens $2 billion overnight
+  | newspaper = San Francisco Chronicle | page = A-1
+  | publisher = Hearst Communications
+  | date = July 2, 2009  | url = http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2009/07/01/MNV118HCO8.DTL
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。2008年後半の経済減退と世界金融危機 (2007年-)世界金融危機への対応が緊急課題となったために州予算の成立が3か月も遅れたが、単に赤字を2009年に繰り越しただけだった。1つの問題は州の歳入のかなりの部分が、少数の富裕な州民から上がる所得税に頼っていることである。例えば2004年の場合、納税者の3%が収税全てのうちの60%を払っていた&lt;ref name="Pender 2006"&gt;{{Cite news 
+  | last = Pender
+  | first = Kathleen
+  | title = Google's April surprise for state
+  | newspaper = San Francisco Chronicle
+  | page = A-1
+  | publisher = Hearst Communications
+  | date = May 9, 2006
+  | url = http://www.sfgate.com/cgi-bin/article.cgi?file=/c/a/2006/05/09/MNGSVIO7NG1.DTL
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。課税できる収入はキャピタルゲインに頼っているために、証券市場の減退が大きく影響してきた。州知事は歳出の大幅なカットと増税を提案してきたが、議会との間で続くこじれのために法案の通過は困難な状況にある。
+
+州の歳出は1998年の560億ドルから2008年の1,310億ドルまで増加し、2008年には400億ドルの赤字になった&lt;ref name="Nunes 2009"&gt;{{Cite news 
+  | last = Nunes  | first = Devin
+  | title = California's Gold Rush Has Been Reversed
+  | newspaper = The Wall Street Journal  | page = A9
+  | publisher = Dow Jones &amp; Company | date = January 10, 2009
+  | url = http://online.wsj.com/article/SB123154816733469917.html
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。2010年には720億ドル&lt;ref name="Moody's Warning"&gt;{{Cite news 
+  | last = Christie | first = Jim | last2 = Linnane |first2 = Ciara |last3 = Parry |first3 = John |editor= Editing by Leslie Adler
+  | title = Moody's warning on California debt stuns state
+  | agency = Reuters | location = San Francisco
+  | publisher = Thomson Reuters
+  | date = June 19, 2009
+  | url = http://www.reuters.com/article/idUSTRE55I52L20090619
+  | accessdate = February 7, 2010}}&lt;/ref&gt;とさらに赤字が増加する可能性がある&lt;ref name="California plea for Aid"&gt;{{Cite news |title = California Makes Plea for U.S. Aid |newspaper = The New York Times |page = A21
+  | agency = Associated Press | publisher = The New York Times Company | date = February 6, 2010
+  | url = http://www.nytimes.com/2010/02/07/us/07calif.html
+  | accessdate = February 7, 2010}}&lt;/ref&gt;。
+
+雇用数を比較すると貿易・交通および公共事業の分野、地方自治体、専門職と事業経営分野、教育と健康分野および観光娯楽分野が3つの大きな分野である。生産高でみると、金融が大きく、続いて貿易・交通および公共事業の分野、教育と健康分野、地方自治体、製造分野の順になる。2010年1月の失業率は12.5%と国内では5番目に高く、2007年の5.9%からかなり上昇した&lt;ref name="Welch 2009"&gt;{{Cite news 
+  | last = Welch | first = William
+  | title = In California's meltdown, misery has long reach
+  | newspaper = USA Today | publisher = Gannett Co
+  | date = February 20, 2009
+  | url = http://www.usatoday.com/news/nation/2009-02-19-california-hurting_N.htm
+  | accessdate = January 29, 2010}}&lt;/ref&gt;&lt;ref&gt;[http://www.bls.gov/lau/ Bls.gov]; Local Area Unemployment Statistics&lt;/ref&gt;。
+
+カリフォルニア州の経済は貿易と国際商取引への依存率が高く、およそ州経済の4分の1に相当している。2008年の輸出額は1,440億ドルであり、2006年の1,270億ドル、2007年の1,340億ドルから増加してきている&lt;ref name="Cal Trade Statistics 2008"&gt;{{Cite web
+  | title = Trade Statistics
+  | publisher = California Chamber of Commerce
+  | url = http://www.calchamber.com/international/trade/pages/tradestatistics.aspx
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。中でもコンピュータと電子製品が2008年の輸出額の42%と飛びぬけて高い
+&lt;ref name="Cal Trade Statistics 2008"/&gt;。
+農業はカリフォルニア州経済の大変重要な分野であり続けている。過去30年間の農業関連売上高は、1974年の73億ドルから2004年の310億ドルと約4倍になった&lt;ref name="Cal Facts 2006 State Economy"&gt;{{Cite web
+  | title = Cal Facts 2006 State Economy
+  | publisher = Legislative Analyst's Office of California
+  | date = August 6, 2007
+  | url = http://www.lao.ca.gov/2006/cal_facts/2006_calfacts_econ.htm
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。この期間、農業用地は15%減り、農業用水供給量は慢性的不安定な状態だったがこれだけ売上高は上がった。これは農業適地を集中的に使ったことと、技術的改善で収量を上げたことが貢献している&lt;ref name="Cal Facts 2006 State Economy"/&gt;。
+
+2007年のカリフォルニア州1人当たり所得は38,956ドルであり、国内の州では8位になっている&lt;ref name="BEA State Personal Income 2006"&gt;{{Cite press release
+  | title = State Personal Income 2006
+  | publisher = Bureau of Economic Analysis
+  | date = March 27, 2007
+  | url = http://www.bea.gov/newsreleases/regional/spi/2007/spi0307.htm
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。これは地域や職業で幅広く異なっている。セントラルヴァレーでは移民農場労働者が最低賃金以下で働いているので最も貧しい地域になっている。近年サンホアキン・バレー地域が[[アパラチア]]地域と並んで、合衆国で最も経済的に落ち込んだ地域の一つになってきた&lt;ref name="CRS San Joaquin Valley"&gt;{{Cite web
+  | last = Cowan | first = Tadlock
+  | title = California’s San Joaquin Valley: A Region in Transition
+  | publisher = Congressional Research Service, Library of Congress
+  | date = December 12, 2005 | page = 2
+  | url = http://www.centralvalleybusinesstimes.com/links/CRS%20San%20Joaquin%20Valley%20Report.pdf
+  | format = PDF | accessdate = January 29, 2010}}&lt;/ref&gt;。海岸にある多くの都市の中には一人当たり所得で合衆国の最も富める地域になっている所がある。北部のハイテク産業が集積した[[シリコンバレー]]、[[サンタクララ郡]]と[[サンマテオ郡]]は[[インターネット・バブル]]による不況から立ち直ってきた。
+
+カリフォルニア州は6等級で変わる所得累進課税方式を採っており、最高税率は9.3%である。所得税総額は年400億ドルになる。消費税率は8.25%であり、地方消費税を含むと10.75%になる&lt;ref name="CAEqualization"&gt;{{cite web |url=http://www.boe.ca.gov/pdf/pub71.pdf |title=Publication 71, California City and County Sales and Use Tax Rates, April 1, 2009 Edition |accessdate=2009-09-26 |author=Equalization California Board of |format=PDF |year=2009 |month=July}}&lt;/ref&gt;。固定資産税は購入時の適正市場価格に基づいて課税され、実勢市場価格に合わせて増税されることはない。
+
+2009年の経済危機でカリフォルニア州は破産状態になっている&lt;ref name="Cal at Budget Impasse 2009"&gt;{{Cite news | title = California at Budget Impasse as State Nears Insolvency
+  | newspaper = Fox News Channel | publisher = News Corp.
+  | date = February 15, 2009 | url = http://www.foxnews.com/politics/2009/02/15/california-budget-impasse-state-nears-insolvency
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。6月にアーノルド・シュワルツェネッガー知事は「我々の財布は空であり、銀行は閉じ、信用は無くなった」と語った&lt;ref Name ="California's time is running out"&gt;{{Cite news 
+  | title = California's time is running out  | newspaper = San Francisco Chronicle
+  | page = A-12 | publisher = Hearst Communications | date = June 4, 2009
+  | url = http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2009/06/03/ED3T180828.DTL
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。現在240億ドルの歳出カットを提案している&lt;ref Name ="California's time is running out"/&gt;。
+
+=== 主な会社など ===
+カリフォルニア州に本拠地のある企業には以下のようなものがある。
+{{col-begin}}
+{{col-3}}
+* [[アップル インコーポレイテッド|アップル]]
+* [[アドビシステムズ]]
+* [[EBay]]
+* [[インテル]]
+* [[ウォルト・ディズニー・カンパニー]]
+* [[オラクル (企業)|オラクル]]
+* [[ギャップ (企業)|GAP]]
+* [[キャロウェイゴルフ]]
+* [[クアルコム]]
+* [[Google]]
+* [[アドバンスト・マイクロ・デバイセズ|AMD]]
+* [[GLOBALFOUNDRIES|グローバルファウンドリーズ]]
+* [[サン・マイクロシステムズ]]
+{{col-3}}
+* [[シェブロン]]
+* [[シスコシステムズ]]
+* [[シマンテック]]
+* [[スカイウォーカー・サウンド]]
+* [[ネットワーク・アプライアンス (企業)|ネットワーク・アプライアンス]]
+* [[ヒューレット・パッカード]]
+* [[ベリサイン]]
+* [[マカフィー]]
+* [[Yahoo!]]
+* [[ユノカル]]
+* [[リーバイス]]
+* [[Marvell]]
+{{col-3}}
+[[ファイル:PB050006.JPG|thumb|right|200px|[[:en:Hollywood Sign|Hollywood Sign]]はカリフォルニア州の巨大な娯楽産業の象徴として最もよく知られている。]]
+{{col-end}}
+
+== 交通 ==
+[[ファイル:GoldenGateBridge.jpg|thumb|サンフランシスコの[[ゴールデンゲートブリッジ|金門橋]]、カリフォルニアでも最も有名なランドマークになている。]]
+カリフォルニアの広大な領域は[[高速道路|フリーウェイ]]、[[自動車専用道路|イクスプレスウェイ]]およびハイウェイ(公道)で繋がれている。車社会であり、都市部は交通渋滞が激しい。州道の建設と保守、および州全体の交通計画は州交通局が担当している。人口の急増で交通網に歪みを来たしており、積極的にフリーウェイの交通網拡張を継続すべきか、都会における大量交通手段の改良に集中すべきかというのが州政の課題で有り続けている。
+
+州内でも有名なランドマークの一つが1937年に完工した[[ゴールデンゲートブリッジ|金門橋]]である。オレンジ色に塗られ湾を見下ろすパノラマのような景色が観光客に人気であり、歩行者や自転車も通ることができる。エル・カミノ・レアル(スペイン語で王立道路)や太平洋岸ハイウェイとも呼ばれる州道1号線の一部であるアメリカ国道101号線として同時に指定された。サンフランシスコ・ベイエリアに架かる7つの橋の中で、1936年に完工した[[サンフランシスコ・オークランド・ベイブリッジ]]も有名である。二階建てのこの橋は1日28万台の交通量があり、イエルバ・ブエナ島で2つの部分に分かれている。
+
+太平洋および合衆国本土内との交通は[[ロサンゼルス国際空港]]と[[サンフランシスコ国際空港]]が大きな中継点になっている。州内には他にも約12の商業空港と多くの一般用と空港がある。
+
+重要な海港も幾つかある。南部のロサンゼルス港とロングビーチ港で作られる巨大な海港は国内でも最大であり、コンテナ取扱量では国内の約4分の1となっている。オークランド港は国内4位であり、環太平洋地域との貿易を扱い、北カリフォルニアから全米に入る海洋コンテナの大半を送り出している。
+
+[[ファイル:Glendalefreeway.jpg|thumb|left|高規格道路のインターチェンジ]]
+都市間鉄道は[[アムトラック]]・カリフォルニアが運行しており、合衆国の[[北東回廊]]の次に運行本数の多い路線が3線ある。ロサンゼルス([[ロサンゼルス郡都市圏交通局]])やサンフランシスコ([[サンフランシスコ市営鉄道]])の都市圏には[[地下鉄]]や[[ライトレール]]のネットワークがある。ライトレールはサンノゼ、サンディエゴ、サクラメントおよび[[サンディエゴ郡 (カリフォルニア州)|サンディエゴ郡]]北部でも運行されている。さらに通勤列車としては、サンフランシスコ・ベイエリアの[[アルタモント通勤急行]]、[[バート (鉄道)|バート]]、カルトレイン、ロサンゼルス大都市圏のメトロリンク、サンディエゴ郡のコースターがある。[[カリフォルニア高速鉄道]]局が1996年に創設され、サンフランシスコとロサンゼルス間を2時間半で結ぶ計画である。総延長は700マイル (1127&amp;nbsp;km) になる可能性がある。100億ドル近い資金(州債)が投入される建設は2008年11月の住民投票で承認された。ほとんど全郡でバス路線を運行しており、多くの都市にもバス便がある。都市間のバス路線は[[グレイハウンド (バス)|グレイハウンド]]とアムトラックのスルーウェイコーチが運行している。
+
+{{col-begin}}
+{{col-2}}
+* 主要な[[州間高速道路]]:
+** [[I-5]]
+** [[I-8]]
+** [[I-10]]
+** [[I-15]]
+** [[I-40]]
+** [[I-80]]
+{{col-2}}
+* 州内の[[空港]]
+** [[サンディエゴ国際空港]](SAN)
+** [[ノーマン・Y・ミネタ・サンノゼ国際空港]](SJC)
+** [[サンフランシスコ国際空港]](SFO)
+** [[ロサンゼルス国際空港]](LAX)
+** [[サクラメント国際空港]] (SMF)
+** [[サンタバーバラ空港]] (SBA)
+** [[サンタモニカ空港]] (SMO)
+** [[オークランド国際空港 (カリフォルニア州)|オークランド国際空港]] (OAK)
+** [[パームスプリングス国際空港]] (PSP)
+** [[サンバーナディーノ国際空港]] (SBD)
+** [[フレズノ・ヨセミテ国際空港]] (FAT)
+** [[カレキシコ国際空港]] (CXL)
+** [[オンタリオ国際空港]] (ONT)
+** [[サンタ・アナ・オレンジ・カウンティー空港]] (SNA)
+{{col-end}}
+
+== 教育 ==
+[[ファイル:THS facade.jpg|thumb|トランス高校はカリフォルニア州で開校を続けている最古の高校であり、テレビや映画の撮影で人気がある。]]
+公立の[[アメリカ合衆国の中等教育|中等教育]]には貿易、言語および教養科目で選択コースを教えている高校があり、天分に恵まれた者、カレッジを指向する者および工業系を指向する生徒のためのものである。カリフォルニア州の公共教育システムは特徴ある憲法修正条項で支持されており、幼稚園性から12年生までと[[コミュニティ・カレッジ]]の最低予算を手当てしている。コミュニティ・カレッジは経済の発展と共に成長し入学者が増えている&lt;ref name="Prop 98"&gt;{{Cite web
+  | title = Proposition 98 Primer 
+  | publisher = Legislative Analyst's Office of California
+  | year = 2005 | month = February
+  | url = http://www.lao.ca.gov/2005/prop_98_primer/prop_98_primer_020805.htm
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。
+
+2005年-2006年学校年では620万人の生徒がいた。カリフォルニは他州にくらべて予算や教師のレベルで遅れを取っている。生徒一人当たり費用は[[ワシントンD.C.]]を含めて51州のうち29番目であり、生徒一人当たり教職員の数は49番目である。生徒対教師の比率も49番目であり、教師1人あたり生徒21人となっている&lt;ref name="How"&gt;{{Cite web
+  | title = California Comparison
+  | publisher = Education Data Partnership
+  | url = http://www.ed-data.k12.ca.us/Articles/article.asp?title=California%20comparison
+  | accessdate = January 29, 2010}}&lt;/ref&gt;。
+
+カリフォルニア州の公共高等教育は、カリフォルニア大学機構、カリフォルニア州立大学機構およびカリフォルニア・コミュニティ・カレッジ機構の特徴ある3階層のシステムである。
+&lt;gallery&gt;
+ファイル:Berkeley glade afternoon.jpg|カリフォルニア大学バークレー校 (Cal)
+ファイル:RHall.JPG|カリフォルニア大学ロサンゼルス校 (UCLA)
+ファイル:Stanford University campus from above.jpg|スタンフォード大学
+ファイル:USC_Bovard_Auditorium.jpg|南カリフォルニア大学 (USC)
+&lt;/gallery&gt;
+
+=== カリフォルニア大学機構 ===
+[[カリフォルニア大学]]機構は世界で最も多くの[[ノーベル賞]]受賞者を雇用している世界でも有数の公立大学機構である。多くの研究型大学を擁する。以下の13のキャンパスを持つ。略称はUC。
+* [[カリフォルニア大学バークレー校]](Cal)
+* [[カリフォルニア大学ロサンゼルス校]](UCLA)
+* [[カリフォルニア大学サンディエゴ校]](UCSD)
+* [[カリフォルニア大学デービス校]](UCD)
+* [[カリフォルニア大学サンタクルーズ校]](UCSC)
+* [[カリフォルニア大学サンタバーバラ校]](UCSB)
+* [[カリフォルニア大学アーバイン校]](UCI)
+* [[カリフォルニア大学リバーサイド校]](UCR)
+* [[カリフォルニア大学マーセド校]](UCM)
+* [[カリフォルニア大学サンフランシスコ校]](UCSF):医学系大学院大学で、カリフォルニア大学の4つある法律大学院の1つであるヘイスティングス・[[ロースクール]]も併設されている。
+
+カリフォルニア大学は[[アメリカ合衆国エネルギー省]]・[[ローレンス・リバモア国立研究所]]、[[ローレンス・バークレー国立研究所]]、及び [[ロスアラモス国立研究所]]の国立研究所の管理を行っている。
+
+=== カリフォルニア州立大学機構 ===
+[[カリフォルニア州立大学]]機構も世界の中でも有数の教育機構の1つだと考えられている。45万人以上の学生を抱えるカリフォルニア州立大学機構はアメリカ合衆国最大の大学機構で、高校生の上位3分の1を受け入れる事を目的としている。主に学部生の教育が意図されている&lt;ref name="CSU Facts 2008"&gt;{{Cite web | title = CSU Facts 2008
+  | publisher = California State University Office of Public Affairs | date = January 21, 2009
+  | url = http://www.calstate.edu/PA/2008Facts/ | accessdate = January 29, 2010}}&lt;/ref&gt;。以下の23の大学、分校などを含む。略称はCSU。
+{{col-begin}}
+{{col-2}}
+* [[ハンボルト州立大学]]
+* [[カリフォルニア州立大学チコ校]]
+* [[ソノマ州立大学]]
+* [[サクラメント州立大学]]
+* [[サンフランシスコ州立大学]]
+* [[カリフォルニア州立大学イーストベイ校]]
+* [[カリフォルニア州立大学ベーカーズフィールド校]]
+* [[カリフォルニア州立大学チャンネルアイランド校]]
+* [[カリフォルニア州立大学ドミンゲスヒルズ校]]
+* [[カリフォルニア州立大学フレズノ校]]
+* [[カリフォルニア州立大学フラートン校]]
+* [[カリフォルニア州立大学ロングビーチ校]]
+{{col-2}}
+* [[カリフォルニア州立大学ロサンゼルス校]]
+* [[カリフォルニア海事大学]]
+* [[カリフォルニア州立大学モントレーベイ校]]
+* [[カリフォルニア州立大学ノースリッジ校]]
+* [[カリフォルニア州立工科大学ポモナ校]]
+* [[カリフォルニア州立大学サンバーナーディーノ校]]
+* [[サンディエゴ州立大学]]
+* [[サンノゼ州立大学]]
+* [[カリフォルニア州立工科大学サンルイス・オビスポ校]]
+* [[カリフォルニア州立大学サンマルコス校]]
+* [[カリフォルニア州立大学スタニスラウス校]]
+{{col-end}}
+
+=== カリフォルニア・コミュニティ・カレッジ機構 ===
+カリフォルニア・コミュニティ・カレッジ機構は低い次元の教科学習を提供し、基本技能や職業訓練に重きを置いている。アメリカ合衆国の中でも最大の高等教育網であり110のカレッジに290万人以上の学生がいる&lt;ref name="California Community College Office"&gt;{{Cite web
+  | title = Community Colleges | publisher = California Community Colleges Chancellor's Office
+  | year = 2009 | url = http://www.cccco.edu/CommunityColleges/tabid/830/Default.aspx | accessdate = January 29, 2010}}&lt;/ref&gt;。
+
+=== 私立大学 ===
+以下の私立大学が有名である。他にも数百の私立カレッジや大学があり、この中には宗教系や特殊目的の学校もある。
+* [[スタンフォード大学]]
+* [[南カリフォルニア大学]](USC)
+* [[クレアモント大学]](ハーベイ・マッド・カレッジとポモナ・カレッジを含む)
+* [[カリフォルニア工科大学]](Caltech):[[アメリカ航空宇宙局|NASA]]の[[ジェット推進研究所]]の管理
+* [[カリフォルニア芸術大学]](CalArts)
+
+== 芸術・文化 ==
+&lt;!--
+
+=== 劇場 ===
+--&gt;
+
+=== 美術館・博物館 ===
+* [[サンタバーバラ自然史博物館]]
+* [[カリフォルニア大学バークレー校古生物博物館]]
+* [[サンフランシスコ近代美術館]]
+
+=== オーケストラなど ===
+* [[サンフランシスコ交響楽団]]
+* [[ロサンジェルス・フィルハーモニック]]
+&lt;!--
+
+=== スポーツチーム ===
+--&gt;
+
+=== 食文化 ===
+[[インディアン]]の他、世界各国からの移民によって構成されているため、都市部では世界各国の料理(またはそれらをアメリカ風にアレンジしたもの)を気軽に楽しむことが可能である。特にもともとメキシコの領土であったことや、メキシコからの移民が多いこともあり[[メキシコ料理]]が非常に一般的であるほか、[[イタリア料理]]や[[中華料理]]、[[ベトナム料理]]などが日常的に楽しまれている。
+
+21世紀初頭の現在、アメリカの大都市はもちろん、全米各地で[[寿司]]や[[照り焼き]]をはじめとする[[日本料理]]が人気を博しており、一般の[[スーパーマーケット]]でも[[豆腐]]、[[醤油]]、[[麺類]]などの食材を調達することが可能であるが、カリフォルニアでは既に[[1970年代]]からその兆しがあった。アジア系住民が多く気候も温暖であることから、[[ダイコン|大根]]、[[白菜]]などのアジア系野菜、カリフォルニア米と呼ばれる中粒や日本の[[あきたこまち]]などの短粒[[ジャポニカ種]]の北米における主要生産地となっており、新鮮なアジア系食材が入手しやすい地域である。[[カリフォルニアロール]]や[[フォーチュン・クッキー]]など既存のアジア食を西洋風にアレンジしたものを全米に浸透させる発信地となることも多い。
+
+== 日本との関係 ==
+=== 日系人 ===
+カリフォルニアは[[ハワイ州|ハワイ]]と並んで、日本人と関係の深い州のひとつである。古くは[[ジョン万次郎]]、[[福澤諭吉]]、[[勝海舟]]から、この地を訪れた日本人は多い。意外なところでは、[[竹久夢二]]もこの地を訪れている。
+
+明治以降は[[日本人]]の[[移民]]が相次ぎ、[[1924年]]に[[日本人]]の移民を禁じる[[排日移民法]]が制定される。この差別的待遇は太平洋戦争によってさらに悪化し、[[日系人]]は土地や財産を没収され、[[日系人収容所所在地|10か所]]の[[日系人の強制収容|強制収容所]]に収容されることになる(キャンプは陸軍省下のWRAによって管理されたものと、司法省によって管理されるキャンプがあった。日系アメリカ人強制収容所と一般に言われる場合には前者のことをさす場合が多い)。これら大戦前の移民の出身地は、圧倒的に[[山陽地方]]及び北部[[九州]]が多く、その理由として、かつては「[[山陽道]]は旅人の往来が多く、他所への移住に抵抗感が少ない地域であるから」とされたが、「この地方は中世以来水軍の活動が顕著で、鎖国が解かれ再び出国ラッシュとなったから」と云う説もある。このためか、かつては「アメリカ日系人の標準語は[[広島弁]]である」とまで言われた。
+
+戦後、[[日系人]]は戦時中に活躍した日系アメリカ人部隊([[陸軍]][[第442連隊戦闘団]]・第100歩兵大隊)の存在や、日系アメリカ人議員の輩出などで、その地位と名誉を回復する。[[1988年]]には強制収容所での不当な扱いに対して[[補償法案]]を通過させ、生存者への金銭的補償を勝ち取った。一般に、[[日系人]]は経済的には平均より恵まれているといえるが、依然としてグラス・シーリング「見えない天井」という社会問題が残されている(そもそも日系アメリカ人は大都市に多く住み、ゆえに所得も平均以上となるのは当然と言われている)。米国の農場主は圧倒的に白人が多い中、カリフォルニアでは、サクラメント近郊等にかなりの割合で日系農場主が存在している。
+
+[[日系人]]社会はおよそ1世と2世、そして戦後から[[1980年]]代までの戦後移民、[[バブル景気|バブル]]以降の新移民に大別することができる。1世は[[経済難民]]的で、苦労して現在の地位を築き上げてきた功労者といえるが、アメリカ社会には同化しにくく、他の移民集団と同様に[[リトル・トーキョー]]に代表される[[エスニック・タウン]]を形成する傾向がある。戦前・戦中の迫害経験から社会に対する猜疑心が強い、とも言われるが、とりわけ強制収容所での経験は1世の父権主義を心理的に崩壊させ、2世リーダーの台頭によって完全にその権威が失われてしまった。
+
+2世や3世、4世は全てにわたって「アメリカ人」である。彼らは父祖の地としての日本に興味はあるものの、それ以上の感情は持たず、思考や行動は極めてアメリカ人的である。ただ2世は親と生地という2つの文化に自己を引き裂かれるというアイデンティティ・クライシスを経験することが多く、[[日系アメリカ人文学]]のテーマとして描かれることが多い。アメリカで生まれ、幼少時より日本で教育を受けた後、再びアメリカに戻った人を[[帰米]]という。この場合は、心情的にも日本人とほとんどかわらないが、彼らのアメリカでの苦労もまた2世と同様に苦難を伴う場合が多かった。
+
+戦後移民は米軍人妻([[戦争花嫁]])や、成功を目指して渡米した人が多い。[[ロッキー青木]]や[[ショー・コスギ]]が代表例である。彼らは日本人と付き合わず、積極的にアメリカ社会に飛び込んでいくという傾向が見られる。そのためこの集団は個々に分散して、1つのエスニック・グループとしては形成されていない。しかし高齢化するにつれ、日本回帰の現象も見られる。
+
+新移民は[[バブル景気|バブル]]以降の日本の国際化を受けて、アメリカで生活することを選んだ人たちである。脱サラ者や定年退職者、留学生などが多いが、彼らの生活は日本との関係に依存している面が多く、近年の不況から、帰国を選択するものも増えてきている。
+
+[[中華民族|中国人]]や[[韓国人]]など他の移民社会と比べると、[[日系人]]社会は分散的である。団結力が弱く、無視しあったり、非難しあったりするケースが多いが、それは1つには上記のように各集団が全く異なる出自や目的を持っているからだと思われる。キャンプでの密告奨励による相互不信、「敗戦国民」として戦勝国アメリカでの社会的地位向上のために積極的に日本文化を棄てたということも関係していると考えられる。
+
+=== 日本の企業進出 ===
+[[1951年]]にサンフランシスコを中心とするカリフォルニア州北部にある日系企業、'''北加日本商工会議所 (JCCNC)''' が設立された。[[2007年]]現在、約300社が加盟している。[[1960年代]]には、ロサンゼルスやサンディエゴを中心とする'''南カリフォルニア日系企業協会 (JBA)''' が設立され、2007年現在の加盟社数は約500に達する。両団体とも、州の認可を受けた[[非営利団体]]である。他州にある日系企業団体や日本人会同様、会員対象のセミナーや親睦行事、日系企業実態の調査、地元地域への日本文化紹介や奉仕活動などを行っている。
+
+[[2000年]]にJBAが行った調査『南カリフォルニア日系企業実態』&lt;sub&gt;&lt;ref&gt;[http://www.hiwave.or.jp/HAPEE/los_report/16.html ひろしま産業振興機構国際部 ロサンゼルスレポート 2001年9月『南カリフォルニア日系企業実態』]&lt;/ref&gt;&lt;/sub&gt;によると、調査対象企業の70%がロサンゼルス郡に集中しており、ロサンゼルス(108社)とトーランス(94社)が突出している。次いで20%が[[オレンジ郡]]に拠点があり、アーバインとサイプレスに多い。またメキシコ国境に近いサンディエゴ郡にも20社存在する。ただし製造業は過密状態のロサンゼルスよりも、オレンジ郡やサンディエゴ郡のメキシコ国境沿いの工業地帯(マキドーラ Maquidora)に多い。日系企業の南カリフォルニアへの進出数は[[1980年代]]をピークに減ってはいるものの、新規設立は続いている。62.4%が米国の法人本社、24.3%が支店として設立しており、アメリカ進出への足掛け地点となっている。雇用者は72.8%の現地採用者が占め、その多くが金融・保険業、製造業に就いている。日本からの派遣社員は不動産業と建設業に多いが、全体の3.1%程度で減少傾向にある。従業員100人以上の中・大規模レベルの企業数と雇用数は減少しており、逆に全体の70%が小規模な企業であり、雇用を増やしている。対象企業の80%が増収、あるいは前年と同程度の利益を見込んでいる。不動産、卸・小売、製造、金融・保険といった業界が好調である。
+
+[[2002年]]にはJCCNCが『ベイエリア日系企業実態調査』を行っている。2000年度の調査と比較して、ベイエリアの企業が減少、1社あたりの平均雇用数も49人と大幅に減少している。日本からの派遣社員は平均4人で変化はない。80%が日本企業の現地法人である。拠点は80%がサンタクララ、サンフランシスコ、サンマテオ郡にある。60%がサービス業または製造業である。売上が過去2年間に増加した企業が36%、減少は46%であり、営業利益は赤字が約34%、今後1、2年の見通しが改善あるいは横ばいと答えた企業が約90%であった。全体の25%が何らかのボランティア活動を行い、アメリカの団体等に対する寄付は総額1940万ドルにのぼっている。
+
+毎年、JCCNCとJBAの代表者が合同で[[サクラメント (カリフォルニア州)|サクラメント]]の州議会を表敬訪問している&lt;sub&gt;&lt;ref&gt;[http://www.jba.org/letter/information/index.html 南カリフォルニア日系企業協会 部会からのお知らせ『州知事との面談かなった2007年度サクラメント訪問』]&lt;/ref&gt;&lt;/sub&gt; &lt;sub&gt;&lt;ref&gt;[http://www.jccnc.org/new.php?cid=137 北加日本商工会議所 2006年 サクラメント表敬訪問]&lt;/ref&gt;&lt;/sub&gt;。[[2007年]]度はシュワルツェネッガー州知事に面会する機会があり、日系企業の投資(1739社による290億ドル)および雇用(15万人)に対する感謝を受けた。州議員には、医療保険や運転免許証といった個人生活レベルから、[[コンテナ]]課税、施設に対する[[消費税]]、環境法案など企業レベルでの問題に対する改善を要請すると同時に、州の企業誘致に対するアドバイスを与えた。アジア系議員とのパイプ作りに昼食会もおこなった。
+
+=== 日本語教育 ===
+日本人が多く、日本と係わり合いの深い地域のため、カリフォルニア州には全日制私立在外教育施設の[[学校法人西大和学園|西大和学園]]や、州内各地に[[文部科学省]]認可の[[補習授業校]]が6校ある。2002年の文科省の発表では、ロサンゼルス補習校(通称:あさひ学園)、サンフランシスコ補習校、サンディエゴ補習校(通称:みなと学園)の3校は生徒数において、世界187校のうち上位10校に入る規模である。なかでも上位1、2位を占めるロサンゼルスとサンフランシスコの補習校は、ともに複数校舎を持ち、在籍生徒数が1000名を超えるマンモス校である。
+
+非認可の補習校も2校あるほか、日本語[[イマージョン・プログラム|イマージョン]]や日本語が教科にある[[公立学校|公立校]]もあり、州内のカリキュラムに沿った日本語教師を対象にした研修&lt;sub&gt;&lt;ref&gt;[http://www.jpf.go.jp/j/japan_j/oversea/kunibetsu/2005/usa.html 国際交流基金 事業内容 海外における日本語教育 『日本語教育国別情報』]&lt;/ref&gt;&lt;/sub&gt;が行われるなど、[[日本語教育]]が盛んである。
+
+[[サブカルチャー]]に対して積極的な風土から、日本の[[アニメ]]・[[漫画|マンガ]]に対しても関心を持つ者が多く、日本語学習の契機となる例が多く見られる。
+
+=== 誘致・親善 ===
+[[2004年]]、アーノルド・シュワルツェネッガー知事が日本を訪問し産業・観光をアピール。2008年から2009年には「なんでもアリフォルニア カリフォルニア」のコピーで州政府観光局が広告活動をしている&lt;ref&gt;[http://www.visitcalifornia.jp/ カリフォルニア州政府観光局-なんでもアルフォルニア]&lt;/ref&gt;。
+
+最近では[[フジテレビ系列]]「[[ワンナイR&amp;R]]」のキャラクター「[[松浦ゴリエ]]」がカリフォルニア州政府公認の親善大使を務める。
+&lt;!--ドラマ『[[白バイ野郎ジョン&amp;パンチ]](「CHiPs」)』の舞台になった、[[カリフォルニア・ハイウェイ・パトロール]]が置かれている事で有名。(州警察はM&amp;Aでハイウェイパトロールに吸収されてしまった)
+↑書いていることが意味不明なので、コメントアウトします。--&gt;
+
+== その他 ==
+=== 同州出身の有名人 ===
+* [[カリフォルニア州出身の人物一覧]]を参照。
+&lt;!--
+
+=== 州の象徴など ===
+* 州の鳥 -
+* 州の花 -
+* 州の木 -
+--&gt;
+
+=== 日本の姉妹都市 ===
+{{col-begin}}
+{{col-3}}
+* (日本) - (州内都市等)
+* ([[大阪府]]) - (カリフォルニア州)
+* ([[北海道]][[せたな町]]/旧 [[瀬棚町]]) - ([[ハンフォード (カリフォルニア州)|ハンフォード市]])
+* (北海道[[芽室町]]) - ([[トレーシー (カリフォルニア州)|トレーシー市]])
+* ([[青森県]][[田子町]]) - ([[ギルロイ (カリフォルニア州)|ギルロイ市]])
+* ([[岩手県]][[北上市]]) - ([[コンコード (カリフォルニア州)|コンコード市]])
+* ([[宮城県]][[仙台市]]) - ([[リバーサイド (カリフォルニア州)|リバーサイド市]])
+* (宮城県[[岩沼市]]) - ([[ナパ (カリフォルニア州)|ナパ市]])
+* (宮城県[[丸森町]]) - ([[ヘメット (カリフォルニア州)|ヘメット市]])
+* (宮城県[[涌谷町]]) - ([[サリナス (カリフォルニア州)|サリナス市]])
+* ([[秋田県]][[男鹿市]]) - ([[リビングストン (カリフォルニア州)|リビングストン 市]])
+* ([[茨城県]][[水戸市]]) - ([[アナハイム|アナハイム市]])
+* (茨城県[[つくば市]]) - ([[ミルピタス (カリフォルニア州)|ミルピタス市]])
+* (茨城県つくば市) - ([[アーバイン (カリフォルニア州)|アーバイン市]])
+* (茨城県[[神栖市]]) - ([[ユーリカ (カリフォルニア州)|ユーリカ市]])
+* (茨城県[[取手市]]/旧 [[藤代町]]) - ([[ユバ (カリフォルニア州)|ユバ市]])
+* (茨城県[[土浦市]]) - ([[パロアルト(カリフォルニア州)|パロアルト市]])
+* ([[栃木県]][[日光市]]) - ([[パームスプリングス (カリフォルニア州)|パームスプリングス市]])
+* (栃木県[[真岡市]]) - ([[グレンドーラ (カリフォルニア州)|グレンドーラ市]])
+* ([[群馬県]][[太田市]]) - ([[バーバンク (カリフォルニア州)|バーバンク市]])
+* ([[埼玉県]][[秩父市]]) - ([[アンチオック (カリフォルニア州)|アンチオック市]])
+* (埼玉県[[飯能市]]) - ([[ブレア (カリフォルニア州)|ブレア市]])
+* (埼玉県[[春日部市]]) - ([[パサデナ (カリフォルニア州)|パサディナ市]])
+* (埼玉県[[深谷市]]) - ([[フレモント (カリフォルニア州)|フレモント市]])
+* (埼玉県[[草加市]]) - ([[カーソン (カリフォルニア州)|カーソン市]])
+* (埼玉県[[蕨市]]) - ([[エルドラド (カリフォルニア州)|エルドラド市]])
+* ([[千葉県]][[市川市]]) - ([[ガーデナ (カリフォルニア州)|ガーデナ市]])
+* (千葉県[[船橋市]]) - ([[ヘイワード (カリフォルニア州)|ヘイワード市]])
+* (千葉県[[木更津市]]) - ([[オーシャンサイド (カリフォルニア州)|オーシャンサイド市]])
+* (千葉県[[成田市]]) - ([[サンブルーノ (カリフォルニア州)|サンブルーノ市]])
+* (千葉県[[柏市]]) - ([[トーランス (カリフォルニア州)|トーランス市]])
+* (千葉県[[富津市]]) - ([[カールスバッド (カリフォルニア州)|カールスバッド市]])
+* (千葉県[[四街道市]]) - ([[リバモア (カリフォルニア州)|リバモア市]])
+* ([[東京都]][[立川市]]) - ([[サンバーナーディーノ (カリフォルニア州)|サンバーナーディーノ市]])
+* (東京都[[日野市]]) - ([[レッドランズ|レッドランズ市]])
+* (東京都[[瑞穂町]]) - ([[モーガンヒル (カリフォルニア州)|モーガンヒル市]])
+{{col-3}}
+* ([[神奈川県]][[小田原市]]) - ([[チュラビスタ (カリフォルニア州)|チュラビスタ市]])
+* (神奈川県[[伊勢原市]]) - ([[ラミラダ (カリフォルニア州)|ラミラダ市]])
+* (神奈川県[[横浜市]]) - ([[サンディエゴ|サンディエゴ市]])
+* ([[新潟県]][[刈羽村]]) - ([[ハーフムーンベイ (カリフォルニア州)|ハーフムーンベイ市]])
+* ([[石川県]][[七尾市]]) - ([[モントレー (カリフォルニア州)|モントレー市]])
+* ([[福井県]][[福井市]]) - ([[フラトン (カリフォルニア州)|フラトン市]])
+* ([[山梨県]][[甲府市]]) - ([[ロダイ (カリフォルニア州)|ロダイ市]])
+* (山梨県[[韮崎市]]) - ([[フェアフィールド (カリフォルニア州)|フェアフィールド市]])
+* ([[長野県]][[大町市]]/旧 [[美麻村]]) - ([[メンドシーノ (カリフォルニア州)|メンドシーノ市]])
+* ([[静岡県]][[静岡市]]) - ([[ストックトン (カリフォルニア州)|ストックトン市]])
+* (静岡県[[三島市]]) - ([[パサデナ (カリフォルニア州)|パサディナ市]])
+* (静岡県[[富士宮市]]) - ([[サンタモニカ|サンタモニカ市]])
+* (静岡県[[島田市]]) - ([[リッチモンド (カリフォルニア州)|リッチモンド市]])
+* (静岡県[[富士市]]) - ([[オーシャンサイド (カリフォルニア州)|オーシャンサイド市]])
+* (静岡県[[磐田市]]) - ([[マウンテンビュー (カリフォルニア州)|マウンテンビュー市]])
+* (静岡県[[函南町]]) - ([[カーマン (カリフォルニア州)|カーマン市]])
+* (静岡県[[浜松市]]/旧 [[三ケ日町]]) - ([[ポータービル (カリフォルニア州)|ポータービル市]])
+* ([[愛知県]][[名古屋市]]) - ([[ロサンゼルス|ロサンゼルス市]])
+* (愛知県[[岡崎市]]) - ([[ニューポートビーチ (カリフォルニア州)|ニューポートビーチ市]])
+* (愛知県[[豊川市]]) - ([[クパチーノ (カリフォルニア州)|クパティーノ市]])
+* (愛知県[[津島市]]) - ([[ハーキュリーズ (カリフォルニア州)|ハーキュリーズ 市]])
+* (愛知県[[安城市]]) - ([[ハンティントンビーチ (カリフォルニア州)|ハンティントンビーチ市]])
+* (愛知県[[犬山市]]) - ([[デービス (カリフォルニア州)|デービス市]])
+* ([[三重県]][[四日市市]]) - ([[ロングビーチ (カリフォルニア州)|ロングビーチ市]])
+* (三重県[[鳥羽市]]) - ([[サンタバーバラ (カリフォルニア州)|サンタバーバラ市]])
+* ([[京都府]][[向日市]]) - ([[サラトガ (カリフォルニア州)|サラトガ市]])
+* ([[大阪府]][[大阪市]]) - ([[サンフランシスコ|サンフランシスコ市]])
+* (大阪府[[堺市]]) - ([[バークリー (カリフォルニア州)|バークレー市]])
+* (大阪府[[岸和田市]]) - ([[サウスサンフランシスコ (カリフォルニア州)|サウスサンフランシスコ市]])
+* (大阪府[[豊中市]]) - ([[サンマテオ (カリフォルニア州)|サンマテオ市]])
+* (大阪府[[貝塚市]]) - ([[カルバーシティ (カリフォルニア州)|カルバーシティ市]])
+* (大阪府[[高石市]]) - ([[ロミタ (カリフォルニア州)|ロミタ市]])
+* (大阪府[[東大阪市]]) - ([[グレンデール (カリフォルニア州)|グレンデール市]])
+{{col-3}}
+* ([[兵庫県]][[明石市]]) - ([[バレホ (カリフォルニア州)|バレホ市]])
+* (兵庫県[[芦屋市]]) - ([[モンテベロ (カリフォルニア州)|モンテベロ市]])
+* (兵庫県[[三木市]]) - ([[バイセリア (カリフォルニア州)|バイセリア市]])
+* (兵庫県[[小野市]]) - ([[リンゼイ (カリフォルニア州)|リンゼイ市]])
+* (兵庫県[[加東市]]/旧 [[滝野町]]) - ([[ホリスター (カリフォルニア州)|ホリスター市]])
+* ([[和歌山県]][[和歌山市]]) - ([[ベイカースフィールド (カリフォルニア州)|ベイカースフィールド市]])
+* (和歌山県[[橋本市]]) - ([[ロナ・パーク (カリフォルニア州)|ロナ・パーク市]])
+* (和歌山県[[有田市]]) - ([[デレノ (カリフォルニア州)|デレノ市]])
+* (和歌山県[[新宮市]]) - ([[サンタクルーズ (カリフォルニア州)|サンタクルーズ市]])
+* (和歌山県[[串本町]]) - ([[ヘメット (カリフォルニア州)|ヘメット市]])
+* (和歌山県[[那智勝浦町]]) - ([[モントレーパーク (カリフォルニア州)|モントレーパーク市]])
+* ([[鳥取県]][[大山町]]/旧 [[中山町 (鳥取県)|中山町]]) - ([[テメキュラ (カリフォルニア州)|テメキュラ市]])
+* (鳥取県[[日南町]]) - ([[スコッツバレー (カリフォルニア州)|スコッツバレー市]])
+* ([[島根県]][[出雲市]]) - ([[サンタクララ (カリフォルニア州)|サンタクララ市]])
+* (島根県[[江津市]]) - ([[コロナ (カリフォルニア州)|コロナ市]])
+* ([[岡山県]][[岡山市]]) - ([[サンノゼ|サンノゼ市]])
+* ([[山口県]][[下関市]]) - ([[ピッツバーグ (カリフォルニア州)|ピッツバーグ市]])
+* ([[香川県]][[坂出市]]) - ([[サウサリート|サウサリート市]])
+* ([[愛媛県]][[松山市]]) - ([[サクラメント (カリフォルニア州)|サクラメント市]])
+* ([[高知県]][[高知市]]) - ([[フレズノ|フレズノ市]])
+* ([[福岡県]][[福岡市]]) - ([[オークランド (カリフォルニア州)|オークランド市]])
+* (福岡県[[久留米市]]) - ([[モデスト (カリフォルニア州)|モデスト市]])
+* (福岡県[[前原市]]) - ([[エスカンディッド (カリフォルニア州)|エスカンディッド市]])
+* ([[佐賀県]][[武雄市]]/旧 [[山内町]]) - ([[セバストポール (カリフォルニア州)|セバストポール市]])
+* ([[熊本県]][[天草市]]/旧 [[本渡市]]) - ([[エンシニタス (カリフォルニア州)|エンシニタス市]])
+* ([[鹿児島県]][[いちき串木野市]]/旧 [[串木野市]]) - ([[サリナス (カリフォルニア州)|サリナス市]])
+* (鹿児島県[[霧島市]]/旧 [[霧島町]]) - ([[ソノラ (カリフォルニア州)|ソノラ市]])
+{{col-end}}
+
+== 脚注 ==
+{{reflist|2}}
+
+== 関連項目 ==
+* [[カリフォルニア電力危機]]
+* [[カリホルニウム]]
+* [[カリフォルニア (戦艦)]]
+* [[カリフォルニアロール|カリフォルニア巻き]]
+
+== 外部リンク ==
+{{Commons&amp;cat|California|California}}
+; 公式
+* [http://www.ca.gov/ カリフォルニア州政府] {{en icon}}
+
+; 日本政府
+* [http://www.la.us.emb-japan.go.jp/web/home.htm 在ロサンゼルス日本国総領事館] {{ja icon}}
+* [http://www.sf.us.emb-japan.go.jp/top.htm 在サンフランシスコ日本国総領事館] {{ja icon}}
+
+; 観光
+{{Wikitravel}}
+* [http://www.visitcalifornia.jp/ カリフォルニア州観光局] {{ja icon}}
+
+; その他
+* [http://www.usajapan.org/ 北カリフォルニア日米協会]
+* [http://www.jas-socal.org/jas/DesktopDefault.aspx 南カリフォルニア日米協会]
+* [http://www.link2la.com/jp/cthv/jthjab/2005/000053.html link2LA.com :南カリフォルニア生活・教育情報サービス]
+
+{{カリフォルニア州}}
+{{アメリカ合衆国の州}}
+
+[[Category:アメリカ合衆国の州|かりふおるにあ]]
+[[Category:カリフォルニア州|*]]
+
+[[af:Kalifornië]]
+[[als:Kalifornien]]
+[[an:California]]
+[[ang:California]]
+[[ar:كاليفورنيا]]
+[[arz:كاليفورنيا]]
+[[ast:California]]
+[[az:Kaliforniya]]
+[[bat-smg:Kalėfuornėjė]]
+[[bcl:California]]
+[[be:Штат Каліфорнія]]
+[[be-x-old:Каліфорнія]]
+[[bg:Калифорния]]
+[[bi:Kalifornia]]
+[[bn:ক্যালিফোর্নিয়া]]
+[[bpy:ক্যালিফোর্নিয়া]]
+[[br:Kalifornia]]
+[[bs:California]]
+[[ca:Califòrnia]]
+[[co:California]]
+[[cs:Kalifornie]]
+[[cv:Калифорни]]
+[[cy:Califfornia]]
+[[da:Californien]]
+[[de:Kalifornien]]
+[[diq:Kaliforniya]]
+[[el:Καλιφόρνια]]
+[[en:California]]
+[[eo:Kalifornio]]
+[[es:California]]
+[[et:California]]
+[[eu:Kalifornia]]
+[[fa:کالیفرنیا]]
+[[fi:Kalifornia]]
+[[fo:Kalifornia]]
+[[fr:Californie]]
+[[frp:California]]
+[[frr:California]]
+[[fy:Kalifornje]]
+[[ga:California]]
+[[gd:Calafòrnia]]
+[[gl:California]]
+[[gn:California]]
+[[gv:California]]
+[[hak:Kâ-li-fuk-nì-â]]
+[[haw:Kaleponi]]
+[[he:קליפורניה]]
+[[hi:कैलिफ़ोर्निया]]
+[[hr:Kalifornija]]
+[[hsb:Kaliforniska]]
+[[ht:Kalifòni]]
+[[hu:Kalifornia]]
+[[hy:Կալիֆորնիա]]
+[[ia:California]]
+[[id:California]]
+[[ig:California]]
+[[ik:California]]
+[[ilo:California]]
+[[io:Kalifornia]]
+[[is:Kalifornía]]
+[[it:California]]
+[[iu:ᑳᓖᐴᕐᓃᐊ/kaaliipuurniia]]
+[[jbo:kalifornias]]
+[[jv:California]]
+[[ka:კალიფორნია]]
+[[kk:Калифорния]]
+[[kn:ಕ್ಯಾಲಿಫೊರ್ನಿಯ]]
+[[ko:캘리포니아 주]]
+[[krc:Калифорния]]
+[[ks:केलिफोर्निया]]
+[[ku:California]]
+[[kw:Kaliforni]]
+[[la:California]]
+[[lad:California]]
+[[lb:Kalifornien]]
+[[li:Californië]]
+[[lij:California]]
+[[lmo:California]]
+[[lt:Kalifornija]]
+[[lv:Kalifornija]]
+[[mg:Kalifornia]]
+[[mi:Karapōnia]]
+[[mk:Калифорнија]]
+[[ml:കാലിഫോർണിയ]]
+[[mn:Калифорни]]
+[[mr:कॅलिफोर्निया]]
+[[ms:California]]
+[[my:ကယ်လီဖိုးနီးယား]]
+[[mzn:کالیفرنیای جزیره مونا]]
+[[nah:California]]
+[[nds:Kalifornien]]
+[[new:क्यालिफोर्निया]]
+[[nl:Californië]]
+[[nn:California]]
+[[no:California]]
+[[nv:Akééháshį́į́ Hahoodzo]]
+[[oc:Califòrnia]]
+[[os:Калифорни]]
+[[pam:California]]
+[[pap:California]]
+[[pl:Kalifornia]]
+[[pms:Califòrnia]]
+[[pnb:کیلیفورنیا]]
+[[pt:Califórnia]]
+[[qu:California suyu]]
+[[rm:California]]
+[[ro:California (stat SUA)]]
+[[ru:Калифорния]]
+[[sah:Калифорния]]
+[[scn:California]]
+[[sco:California]]
+[[sh:Kalifornija]]
+[[simple:California]]
+[[sk:Kalifornia]]
+[[sl:Kalifornija]]
+[[sq:Kalifornia]]
+[[sr:Калифорнија]]
+[[su:Kalifornia]]
+[[sv:Kalifornien]]
+[[sw:California]]
+[[szl:Kaliforńijo]]
+[[ta:கலிபோர்னியா]]
+[[te:కాలిఫోర్నియా]]
+[[th:รัฐแคลิฟอร์เนีย]]
+[[tl:Kaliporniya]]
+[[tr:Kaliforniya]]
+[[tt:Калифорния]]
+[[ug:Kaliforniye Shitati]]
+[[uk:Каліфорнія]]
+[[ur:کیلی فورنیا]]
+[[uz:Kaliforniya]]
+[[vec:Całifornia]]
+[[vi:California]]
+[[vo:California]]
+[[wa:Californeye]]
+[[war:California]]
+[[wuu:加利福尼亚]]
+[[xal:Калифорни]]
+[[yi:קאליפארניע]]
+[[yo:California]]
+[[zh:加利福尼亚州]]
+[[zh-min-nan:California]]
+[[zh-yue:加利福尼亞州]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/カーマン・ライン.xml b/WptscsTest/Data/MediaWiki/ja/カーマン・ライン.xml
new file mode 100644 (file)
index 0000000..62b4f11
--- /dev/null
@@ -0,0 +1,89 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>カーマン・ライン</title>\r
+    <id>1661853</id>\r
+    <revision>\r
+      <id>33857964</id>\r
+      <timestamp>2010-09-05T14:03:13Z</timestamp>\r
+      <contributor>\r
+        <username>Luckas-bot</username>\r
+        <id>225041</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[no:Kármánlinjen]]</comment>\r
+      <text xml:space="preserve">[[File:Atmosphere layers-en.svg|thumb|right|180px|[[大気#地球大気の鉛直構造|地球大気の鉛直構造]]:&lt;br /&gt;(上から下へ)&lt;br /&gt;[[外気圏]] (Exosphere)&lt;br /&gt;[[熱圏]] (thermosphere)&lt;br /&gt;[[中間圏]] (mesosphere)&lt;br /&gt;[[成層圏]] (stratosphere)&lt;br /&gt;[[対流圏]] (troposphere)&lt;br /&gt;&lt;ref&gt;http://www.srh.noaa.gov/srh/jetstream/atmos/layers.htm&lt;/ref&gt;''(縮尺は無視)''。]]
+'''カーマン・ライン'''({{Lang-en|Kármán line}})は、[[海抜]][[高度]]100 [[キロメートル|km]](62.1 [[マイル|miles]])を超える高度に達した人工物および人間を[[宇宙飛行]]を行ったと認定する、[[国際航空連盟]]が定める仮想のラインである&lt;ref&gt;{{cite web|url=http://www.fai.org/press_releases/2004/documents/12-04_100km_astronautics.doc|title=The 100 km Boundary for Astronautics|publisher=[[国際航空連盟]]プレスリリース|date=2004年6月24日|format=DOC|accessdate=2006年10月30日}}&lt;/ref&gt;。このラインを超えた先が[[宇宙空間]]、この高度以下は[[地球の大気|地球の大気圏]]と定義される。カルマン線とも言う。
+
+カーマン・ラインの名は、[[ハンガリー]]出身の航空工学者・[[セオドア・フォン・カルマン]](Theodore von Kármán, 英語読みで「カーマン」)に由来する。
+
+== 概要 ==
+厳密には地球の大気圏に明確な縁はなく、大気圏は高度が上がるほど希薄になり、その層の重なりは様々な考え方で分類されている。このため、宇宙空間との境界線については分類方法によって非常に異なるものが設定されており、例えば[[熱圏]]や[[外気圏]]をも地球の大気圏に含めるならば、宇宙空間との境界線は海抜高度1万 kmまで跳ね上がる。
+
+層の重なりについて詳しくは右表を参考にされたい。
+
+=== カーマン・ラインの設定の経緯 ===
+[[1950年代]]に[[宇宙開発]]([[宇宙航空学]]の研究)が開始されたとき、地球大気圏を脱出するための[[軌道速度]]として[[宇宙速度]]が計算されたが、このときにおおよその宇宙との境界線として海抜高度100 kmが設定され、計算に使用された。厳密にはその距離は100 kmちょうどではなかったが、様々なパラメータや状況、要素によって常に完全に一致しないことを理由にカーマン・ラインを宇宙空間との境界線とすることを提案し、国際委員会は国際航空連盟 (FAI) にこれを推薦した&lt;ref name="nasa2005"&gt;{{citeweb|title=A word about the definition of space|url=http://www.nasa.gov/centers/dryden/news/X-Press/stories/2005/102105_Schneider.html|publisher=''[[NASA]]''|accessdate=2008-04-29}}&lt;/ref&gt;。
+
+その後この提案は採用され、現在に至るまでカーマン・ラインは様々な目的のために使用される宇宙空間との境界線の定義として活用されている&lt;ref name="nasa2005" /&gt;。
+
+== 脚注 ==
+{{reflist}}
+
+{{DEFAULTSORT:かあまんらいん}}
+[[Category:大気]]
+[[Category:宇宙空間]]
+
+[[bn:কার্মান রেখা]]
+[[ca:Línia de Karman]]
+[[cs:Kármánova hranice]]
+[[de:Kármán-Linie]]
+[[en:Kármán line]]
+[[es:Línea de Kármán]]
+[[et:Kármáni joon]]
+[[fi:Kármánin raja]]
+[[fr:Ligne de Kármán]]
+[[hu:Kármán-vonal]]
+[[it:Linea di Kármán]]
+[[lv:Karmana līnija]]
+[[nl:Kármánlijn]]
+[[no:Kármánlinjen]]
+[[pl:Linia Kármána]]
+[[pt:Linha Kármán]]
+[[ro:Linia Kármán]]
+[[ru:Линия Кармана]]
+[[sv:Karmanlinjen]]
+[[tr:Atmosferin katmanları]]
+[[zh:卡門線]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/スケールド・コンポジッツ.xml b/WptscsTest/Data/MediaWiki/ja/スケールド・コンポジッツ.xml
new file mode 100644 (file)
index 0000000..420234c
--- /dev/null
@@ -0,0 +1,97 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>スケールド・コンポジッツ</title>\r
+    <id>816541</id>\r
+    <revision>\r
+      <id>31958954</id>\r
+      <timestamp>2010-05-06T14:18:36Z</timestamp>\r
+      <contributor>\r
+        <username>TXiKiBoT</username>\r
+        <id>107492</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[fa:سکیلد کامپوزیتس]]</comment>\r
+      <text xml:space="preserve">[[Image:Spaceship One and White Knight in flight 1.jpg|thumb|right|220px|ホワイト・ナイトに搭載されて飛行中の[[スペースシップワン]]]]
+'''スケールド・コンポジッツ'''(''Scaled Composites'' 、単に'''スケールド'''とも)は、[[カリフォルニア州]][[モハーヴェ]]の[[モハーヴェ空港|モハーヴェ宇宙港]]に位置する[[航空機]]・[[宇宙機]]の[[メーカー]]。実験的な機体の設計・開発を得意とする。もとは'''ルータン航空機製作所'''(''Rutan Aircraft Factory'' )と称した。'''スケールド・コンポジット'''という日本語で表記されることもある&lt;!--JAXAとかね……--&gt;。
+
+著名な航空機設計者[[バート・ルータン]]が率いるこの会社は現在、前衛的な航空機の概念設計や様々な輸送機器に関する[[試作機]]の製造プロセスの開発に焦点を当てている。
+
+[[1986年]]に初の無着陸・無給油で[[世界一周飛行]]を達成した[[ルータン ボイジャー|ボイジャー]]([[ジーナ・イェーガー]]と[[ディック・ルータン]]の二人乗り)や、[[2005年]]に初の単独・無着陸・無給油で世界一周を達成した[[グローバルフライヤー]]([[スティーブ・フォセット]]の単独飛行)、[[2004年]]に[[Ansari X Prize]]を受賞した[[宇宙船]]の[[スペースシップワン]]とその母機[[ホワイトナイト (航空機)|ホワイトナイト]]などで知られる。他に[[アメリカ航空宇宙局|NASA]]が大気観測ミッションなどに使用した、タンデム・ウィングの[[スケールド・コンポジッツ プロテウス|プロテウス]](有人または[[無人航空機|無人]])も開発している。これらの機体の構造には、社名ともなっている[[複合材料]] (''Composite materials'' 、''Composites'' )が多用されている。
+
+== プロジェクト ==
+=== ルータン航空機製作所の航空機 ===
+* [[ルータン バリ・ビゲン|モデル27 バリ・ビゲン]] ([[1972年]])
+* [[ルータン バリ・イージー|モデル31 バリ・イージー]] ([[1975年]])
+* [[ルータン バリ・ビゲン|モデル32 バリ・ビゲンSP]] ([[1973年]])
+* [[ルータン バリ・イージー|モデル33 バリ・イージー]] ([[1976年]])
+* [[ルータン クイッキー|モデル54 クイッキー]] ([[1978年]])
+* [[ルータン ロング・イージー|モデル61 ロング・イージー]] ([[1979年]])
+* [[ルータン ボイジャー|モデル76 ボイジャー]] 世界初の無着陸・無給油の世界一周飛行 ([[1986年]])
+
+=== スケールド・コンポジッツの航空機 ===
+* [[ビーチクラフト スターシップ|モデル115 スターシップ]] : [[ビーチクラフト]]モデル2000 スターシップの開発のために作られた、85%サイズの試作機([[1982年]])
+* [[X-38 (航空機)|モデル276 NASA X-38]] ([[1998年]])
+* [[スケールド・コンポジッツ プロテウス|モデル281 プロテウス]] ([[1998年]])
+* [[X-47 (航空機)|モデル326 ノースロップグラマン X-47 ペガサス]] ([[2001年]])
+* Tier One ([[2003年]])
+**[[スペースシップワン|モデル316 スペースシップワン]]
+**[[ホワイトナイト (航空機)|モデル318 ホワイトナイト]]
+* [[グローバルフライヤー|モデル311 ヴァージン・アトランティック グローバルフライヤー]] ([[2004年]])
+* Tier 1b ([[2008年]])
+**[[スペースシップツー|モデル339 スペースシップツー]]
+**[[ホワイトナイトツー|モデル348 ホワイトナイトツー]]
+
+== 関連項目 ==
+*[[航空機メーカーの一覧]]
+
+{{DEFAULTSORT:すけるとこんほしつつ}}
+[[Category:アメリカ合衆国の航空機メーカー]]
+[[Category:航空宇宙企業]]
+{{aviation-stub}}
+{{space-stub}}
+
+[[de:Scaled Composites]]
+[[en:Scaled Composites]]
+[[es:Scaled Composites]]
+[[fa:سکیلد کامپوزیتس]]
+[[fi:Scaled Composites]]
+[[fr:Scaled Composites]]
+[[it:Scaled Composites]]
+[[nl:Scaled Composites]]
+[[pl:Scaled Composites]]
+[[pt:Scaled Composites]]
+[[ru:Scaled Composites]]
+[[sv:Scaled Composites]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/スペースシップツー.xml b/WptscsTest/Data/MediaWiki/ja/スペースシップツー.xml
new file mode 100644 (file)
index 0000000..df79553
--- /dev/null
@@ -0,0 +1,95 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="ja">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>
+    <generator>MediaWiki 1.17wmf1</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">メディア</namespace>
+      <namespace key="-1" case="first-letter">特別</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">ノート</namespace>
+      <namespace key="2" case="first-letter">利用者</namespace>
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>
+      <namespace key="6" case="first-letter">ファイル</namespace>
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>
+      <namespace key="102" case="first-letter">プロジェクト</namespace>
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>
+    </namespaces>
+  </siteinfo>
+  <page>
+    <title>スペースシップツー</title>
+    <id>1751498</id>
+    <revision>
+      <id>32113142</id>
+      <timestamp>2010-05-16T01:47:15Z</timestamp>
+      <contributor>
+        <ip>59.84.93.2</ip>
+      </contributor>
+      <text xml:space="preserve" bytes="4801">{{Infobox 航空機
+  |名称 = スペースシップツー
+  |画像 = ファイル:SS2 and VMS Eve.jpg
+  |キャプション = 
+  |用途 = [[スペースプレーン]]
+  |製造者 = [[スケールド・コンポジッツ]]
+  |運用状況 = 生産中(1号機は2009年12月7日ロールアウト)
+}}
+スケールド・コンポジッツ '''モデル339 スペースシップツー''' (Model 339 SpaceShipTwo, SS2) は、開発中の[[宇宙旅行|宇宙旅行者]]向けの[[弾道飛行]][[スペースプレーン]]である。[[スケールド・コンポジッツ]]と、[[リチャード・ブランソン]]の[[ヴァージン・グループ]]によるジョイントベンチャーである[[スペースシップ・カンパニー]] ([[:en:The Spaceship Company|The Spaceship Company]]) により、Tier 1bプログラムの一部として開発されている。2009年12月7日、[[カリフォルニア州]]の[[モハーヴェ空港|モハーヴェ宇宙港]]にて1号機'''[[VSSエンタープライズ]]'''が公開され、2010年3月22日には母機に吊るされて初飛行を行った&lt;ref&gt;{{cite news
+| title= VSSエンタープライズ“処女飛行”
+| url= http://www.nationalgeographic.co.jp/news/news_article.php?file_id=2010032508&amp;expand
+| publisher=ナショナルジオグラフィック ニュース | date=2010-03-25 | accessdate=2010-03-28 }}&lt;/ref&gt;。
+
+宇宙航空会社の[[ヴァージン・ギャラクティック]]は、2009年以前には行われたことのなかった乗客向けの[[民間宇宙飛行]]サービスを提供するために、この宇宙機を5機編成で運用する予定である&lt;ref&gt;{{cite web|url=http://www.nytimes.com/2008/01/23/science/space/23cnd-spaceship.html?hp|title=New Tourist Spacecraft Unveiled|accessdate=2008-01-23|author=John Schwartz|publisher=nytimes.com}}&lt;/ref&gt;。初めての宇宙飛行は2011年6月前後に行うとしている&lt;ref&gt;{{cite web|url=http://www.afpbb.com/article/environment-science-it/science-technology/2672434/5010250|title=格安宇宙旅行実現へ、ヴァージン・ギャラクティック 世界初の商用宇宙船を公開|date=2009-12-07|accessdate=2009-12-09|publisher=[[フランス通信社|AFPBB News]]}}&lt;/ref&gt;。
+
+== 設計と開発 ==
+[[ファイル:Trajectoire-White-Knight.png|thumb|300px]]
+世界初の民間宇宙船[[スペースシップワン]]は、[[ポール・アレン]]が出資し、スケールド・コンポジッツが実施したTier Oneプログラムの一部として開発された。スペースシップツーはその技術の一部を基に作られている。スペースシップ・カンパニーはポール・アレンの[[モハーヴェ・エアロスペース・ベンチャーズ]]からライセンスを受けている。
+
+スペースシップツーは、8人の乗員(6人の乗客と2人のパイロット)を乗せることができる。飛行軌道の[[遠地点]]はおよそ高度110&amp;nbsp;km (68マイル)の[[熱圏]]内である。これはスペースシップワンの目標高度である[[カーマン・ライン]]よりも10&amp;nbsp;km (6マイル)高い(もっとも、スペースシップワンの最後のフライトは112&amp;nbsp;kmに達している)。スペースシップツーは母機である[[ホワイトナイトツー]]から、高度15,200&amp;nbsp;m (50,000フィート)で発射され、1基の[[ハイブリッドロケット]]により4,200&amp;nbsp;km/h (2,600 mph) の速度に達する。客室は長さ3.66&amp;nbsp;m(12フィート)、直径2.28&amp;nbsp;m(7.5フィート)である。&lt;ref name=&quot;flightglobal-unveil&quot;&gt;{{cite web |url=http://www.flightglobal.com/articles/2008/01/23/221031/pictures-virgin-galactic-unveils-dyna-soar-style-spaceshiptwo-design-and-twin-fuselage-white-knight.html|title=PICTURES: Virgin Galactic unveils Dyna-Soar style SpaceShipTwo design and twin-fuselage White Knight II configuration |accessdate=2008-01-23 |author=Rob Coppinger|publisher=flightglobal.com }}&lt;/ref&gt; 翼長は8.23&amp;nbsp;m(27フィート)、全長は18.29&amp;nbsp;m (60フィート)、尾翼の高さは4.57&amp;nbsp;m(15フィート)である。
+
+== 脚注 ==
+{{Reflist}}
+
+== 外部リンク ==
+{{commonscat|SpaceShipTwo}}
+*[http://www.scaled.com Scaled Composites] {{ref-en}}
+
+== 関連項目==
+* [[宇宙旅行]]
+* [[スケールド・コンポジッツ]]
+
+{{Reusable launch systems}}
+
+{{DEFAULTSORT:すへすしつふ2}}
+[[Category:宇宙船]]
+
+[[cs:SpaceShipTwo]]
+[[de:SpaceShipTwo]]
+<!--当面NUnitが対応できないのでコメントアウト[[en:SpaceShipTwo]]-->
+[[eo:SpaceShipTwo]]
+[[es:SpaceShipTwo]]
+[[fa:فضاپیمای دو]]
+[[fr:SpaceShipTwo]]
+[[hu:SpaceShipTwo]]
+[[it:Scaled Composites SpaceShipTwo]]
+[[nl:SpaceShipTwo]]
+[[pl:SpaceShipTwo]]
+[[ru:SpaceShipTwo]]
+[[sk:SpaceShipTwo]]
+[[sv:SpaceShipTwo]]
+[[zh:太空船2号]]</text>
+    </revision>
+  </page>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/ja/スペースシップワン.xml b/WptscsTest/Data/MediaWiki/ja/スペースシップワン.xml
new file mode 100644 (file)
index 0000000..6243d39
--- /dev/null
@@ -0,0 +1,181 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>スペースシップワン</title>\r
+    <id>103231</id>\r
+    <revision>\r
+      <id>31953257</id>\r
+      <timestamp>2010-05-06T08:21:22Z</timestamp>\r
+      <contributor>\r
+        <username>Loveless</username>\r
+        <id>129239</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[fa:فضاپیمای یک]]</comment>\r
+      <text xml:space="preserve">'''スペースシップワン''' ('''SpaceShipOne''') は[[スケールド・コンポジッツ|スケールド・コンポジッツ社]]によって開発された有人[[宇宙船]]である。[[企業|民間企業]]による[[有人宇宙飛行]]としては世界で初めて、[[2004年]][[6月21日]]に高度約[[1_E5_m|100 km]](10万メートル)を達成した。
+[[Image:Spaceship One and White Knight in flight 1.jpg|thumb|right|250px|ホワイト・ナイトに搭載されて飛行中のスペースシップワン]]
+
+さらに、[[2004年]][[9月29日]]、[[10月4日]]には、民間宇宙船開発に対する賞金制度「[[Ansari X Prize|ANSARI X PRIZE]]」の受賞条件を最も早く達成し、賞金1000万ドルを同社は獲得した。なお、受賞条件は以下の通り。
+* 高度100 km以上に到達する
+* 乗員3名(操縦者1名と乗員2名分のバラスト)相当を打ち上げる
+* 2週間以内に同一機体を再使用し、飛行を行う
+
+それまでの宇宙開発は、すべて国家計画の一環であり、国家予算を使って行われていたものである。事実、[[スプートニク1号|世界初の人工衛星]]、[[ボストーク|初の有人宇宙飛行]]、[[アポロ11号|初の有人月着陸]]、いずれも国家の強力な主導のもとで行われた。しかしながら、航空宇宙史を振り返ると、[[ライト兄弟]]の初飛行、[[チャールズ・リンドバーグ|リンドバーグ]]の大西洋無着陸横断などの大記録は民間・個人によって達成されたものであった。スペースシップワンが達成した成果はしばしばこれらに匹敵する成功として評価されている。史上初の民間による宇宙飛行の栄誉をたたえ、[[NASA]]の惑星探査機[[ニュー・ホライズンズ]]には、スペースシップワンの機体の一部が搭載されて宇宙へと旅立っていった。
+
+[[ヴァージングループ]]に設立された宇宙旅行会社[[ヴァージン・ギャラクティック]](Virgin Galactic) はスペースシップワンからの技術供与を受け、宇宙旅行ビジネスを開始することを発表した。2007年からのサービス開始を目指していたが、2010年現在も実現は難航している。
+[[Image:Spaceship One at Smithsonian.jpg|thumb|right|250px|[[国立航空宇宙博物館]]に展示されているスペースシップワン]]
+
+== 飛行の概要 ==
+[[Image:Spaceship One in flight 1.jpg|thumb|right|250px|飛行中のスペースシップワン]]
+[[Image:Spaceship One cockpit in flight.jpg|thumb|right|250px|飛行中のホワイトナイトの操縦席]]
+初めて高度100kmを達成した2004年6月21日の飛行'''15P'''は次のように行われた。
+
+カリフォルニア州モハベ砂漠にある飛行場から離陸。運搬用航空機「[[ホワイトナイト (航空機)|ホワイトナイト]]」により吊り下げられた状態のまま、高度約15キロまで上昇後、切り離された。その後は[[ロケット|ロケットエンジン]]に点火し音速の3倍まで加速。ロケットの燃焼終了後は[[慣性]]で放物線を描くように[[弾道飛行]]し、ついに高度100kmへの到達を果たした。3分間余りの[[無重量状態]]での宇宙飛行を経て、大気圏に再突入。高度15キロまで降下した後は滑空により元の飛行場へ着陸した。更に'''16P'''・'''17P'''にて2週間以内の再飛行を達成、X PRIZE受賞条件をクリアした。
+
+現在、スペースシップワンの実物は[[アメリカ合衆国]][[ワシントンD.C.]]の[[国立航空宇宙博物館]]で見る事ができる。
+
+
+
+
+{| cellpadding="4" cellspacing="3" border="1"
+|+スペースシップワンの飛行記録
+|- bgcolor="#A0DFFF"
+!飛行番号!!日付!!最高速度!!到達高度!!パイロット!!備考
+|- bgcolor="e0ffe0"
+!11P
+|2003-12-17||[[マッハ]]1.2||align="right"|20.7 km||Brian Binnie||&amp;nbsp;
+|- bgcolor="e0e0e0"
+!13P
+|2004-04-08|||マッハ1.6||align="right"|32.0 km||Peter Siebold||&amp;nbsp;
+|- bgcolor="e0ffe0"
+!14P
+|2004-05-13||マッハ2.5||align="right"|64.4 km||Mike Melvill||&amp;nbsp;
+|- bgcolor="e0e0e0"
+!15P
+|2004-06-21||マッハ2.9||align="right"|100.1 km||Mike Melvill||初の高度100km超
+|- bgcolor="e0ffe0"
+!16P
+|2004-09-29||&amp;nbsp;||align="right"|102.9 km||Mike Melvill||&amp;nbsp;
+|- bgcolor="e0e0e0"
+!17P
+|2004-10-04||マッハ3.09||align="right"|112.0 km||Brian Binnie||X PRIZE受賞
+|}
+
+== 機体 ==
+{|class="wikitable" align="right"
+|-align="center"
+!乗員
+|1名(最大3名可)
+|-align="center"
+!全長
+|5 m
+|-align="center"
+!翼幅
+|5 m
+|-align="center"
+!胴体直径
+|1.52 m
+|-align="center"
+!翼面積
+|15 m²
+|-align="center"
+!機体質量
+|1200 kg
+|-align="center"
+!離陸時質量
+|3600 kg
+|-align="center"
+!推力
+|7500 kgf (74 kN)
+|-align="center"
+!比推力
+|250 s (2.5 km/s)
+|-align="center"
+!燃焼時間
+|87 s
+|}
+機体は米国の航空機開発会社、[[スケールド・コンポジッツ|スケールド・コンポジッツ社]]の設計によるもので、重さ約3トン、3人乗り。[[ロケット|ロケットエンジン]]は、[[酸化|酸化剤]]として液体の[[亜酸化窒素]]、推進剤として固体の合成[[ゴム]]を使用した[[ハイブリッドロケット]]である。制御性に優れた液体ロケットの長所と、取り扱いが容易な固体ロケットの長所の双方を兼ね備えている(詳細については[[ロケットエンジンの推進剤]]を参照)。高度15キロメートルまでは親機ホワイトナイトに吊り下げられて上昇することにより、大気圏を脱出するために必要な燃料の量を抑えている。
+
+尾翼部分が回転し65°まで立てることが出来る特徴的な設計となっている。最高度からの落下時には尾翼を立てることで、降下スピードを抑え、機体の加熱を防いでいる。また、これによって落下時の機体の安定性を保つ役割も果たしている。
+高度15.5キロメートルまで降下した時点で尾翼を水平に戻し、滑空しながら着陸地点を目指す。
+
+登録されている機体番号はN328KFで、これは目標高度の100 km(= 約328キロ[[フィート]])に由来する。同社によれば、N100KMという機体番号は既に取得されていたとのことである。
+
+==ギャラリー==
+&lt;gallery&gt;
+Image:SpaceShipOne schematic.png|スペースシップワンの[[ハイブリッドロケット]]エンジンの詳細 ([http://scaled.com/projects/tierone/data_sheets/html/ox_tank.htm より詳しい情報]).
+Image:Ss1 smithsonian.jpg|ワシントンD.Cの国立航空宇宙博物館のスペースシップワン [[スピリットオブセントルイス号]]と[[X-1 (航空機)|ベル X-1]] "Glamorous Glennis"と並んで展示される
+Image:Spaceship One.JPG|展示されている様子
+&lt;/gallery&gt;
+
+== 関連項目 ==
+* [[アニューシャ・アンサリ]]
+* [[宇宙旅行]]
+
+== 外部リンク ==
+* [http://udonfact.hp.infoseek.co.jp/paper/space/ss1.html Space Ship One スペースシップワン]
+* [http://scaled.com/projects/tierone/index.htm SpaceShipOne] (スケールド・コンポジッツ社、英語)
+
+{{commons|Category:Spaceship One|{{PAGENAME}}}}
+{{Reusable launch systems}}
+{{DEFAULTSORT:すへすしつふ1}}
+[[Category:宇宙船]]
+[[Category:ヴァージン・グループ]]
+
+[[ar:سبيس شيب وان]]
+[[bg:SpaceShipOne]]
+[[ca:SpaceShipOne]]
+[[cs:SpaceShipOne]]
+[[da:SpaceShipOne]]
+[[de:SpaceShipOne]]
+[[en:SpaceShipOne]]
+[[eo:SpaceShipOne]]
+[[es:SpaceShipOne]]
+[[fa:فضاپیمای یک]]
+[[fi:SpaceShipOne]]
+[[fr:SpaceShipOne]]
+[[he:ספייס שיפ 1]]
+[[hu:SpaceShipOne]]
+[[it:Scaled Composites SpaceShipOne]]
+[[ko:스페이스십원]]
+[[ms:SpaceShipOne]]
+[[nl:SpaceShipOne]]
+[[pl:SpaceShipOne]]
+[[pt:SpaceShipOne]]
+[[ru:SpaceShipOne]]
+[[sk:SpaceShipOne]]
+[[sl:SpaceShipOne]]
+[[sv:SpaceShipOne]]
+[[zh:太空船1號]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/スペースシップ・カンパニー.xml b/WptscsTest/Data/MediaWiki/ja/スペースシップ・カンパニー.xml
new file mode 100644 (file)
index 0000000..f8cf935
--- /dev/null
@@ -0,0 +1,32 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="ja">
+  <siteinfo>
+    <sitename>Wikipedia</sitename>
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>
+    <generator>MediaWiki 1.17wmf1</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">メディア</namespace>
+      <namespace key="-1" case="first-letter">特別</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">ノート</namespace>
+      <namespace key="2" case="first-letter">利用者</namespace>
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>
+      <namespace key="4" case="first-letter">Wikipedia</namespace>
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>
+      <namespace key="6" case="first-letter">ファイル</namespace>
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>
+      <namespace key="100" case="first-letter">Portal</namespace>
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>
+      <namespace key="102" case="first-letter">プロジェクト</namespace>
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>
+    </namespaces>
+  </siteinfo>
+</mediawiki>
diff --git a/WptscsTest/Data/MediaWiki/ja/スペースプレーン.xml b/WptscsTest/Data/MediaWiki/ja/スペースプレーン.xml
new file mode 100644 (file)
index 0000000..5bd97e1
--- /dev/null
@@ -0,0 +1,107 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>スペースプレーン</title>\r
+    <id>514976</id>\r
+    <revision>\r
+      <id>33343356</id>\r
+      <timestamp>2010-08-03T13:18:57Z</timestamp>\r
+      <contributor>\r
+        <ip>114.186.131.179</ip>\r
+      </contributor>\r
+      <comment>/* 関連項目 */</comment>\r
+      <text xml:space="preserve">[[Image:X-30 futuristic nasa.jpg|thumb|300px|スペースプレーン (NASP) の想像図&lt;br/&gt;(画像は[[X-30 (航空機)|X-30]]([[1986年]]))]]
+[[画像:X-30 NASP 3.jpg|thumb|right|300px|X-30の想像図]]
+
+'''スペースプレーン''' ('''Spaceplane''') とは、[[航空機]]と同様に特別な打ち上げ設備を必要とせず、自力で滑走し離着陸および大気圏離脱・突入を行うことができる[[宇宙船]]。広義の意味として、[[スペースシャトル]]のように[[翼]]を持ち、飛行機のように滑空して着陸する機体全てを指すこともある。
+
+== 概要 ==
+宇宙空間までの輸送・移動手段としては、[[使い捨て型ロケット]]が使用される事が多いが、これは煩雑な打ち上げ設備を必要とし、発進箇所が限られるという制約がある。例外は[[スペースシャトル]]であるが、着陸については通常の滑走路を使用するものの、打ち上げについては使い捨て型ロケットと同様の設備を必要としている。
+
+スペースプレーンにおいては、通常の航空機と同じように滑走路から離陸し、そのまま大気圏を離脱、そして大気圏再突入後は再び滑走路に着陸することが考えられている。このため、煩雑な打ち上げ設備を必要とせず、滑走路と若干の支援設備のみで運用が可能となり、打ち上げコストの減少や運用可能地点の増加が見込まれる。また、飛行機のような運用を行う発想から、一般的に翼を有するデザインをしている。かつ、ほとんどの場合、[[再使用型宇宙往還機]]でもある。
+
+構想としては、1930年代に[[ドイツ]]において[[ゼンガー (航空機)|ゼンガー]]計画として構想されていた。1980年代には[[アメリカ合衆国]]で極超音速旅客機の[[X-30 (航空機)|X-30]]が国家構想として発表されたが、構想のみに終わっている。
+
+技術的特徴として、大気圏内においては[[エアブリージング]](空気吸い込み型)[[エンジン]]を利用することが挙げられる。通常の[[ロケット]]では燃料となる[[液体水素]]以外に酸化剤として[[液体酸素]]等を自重に含むため、[[ツィオルコフスキーの公式]]により一層の性能向上は難しい。そこで、酸化剤を全て搭載せず、ジェットエンジンのように空気中の[[酸素]]を酸化剤として使用することが考えられている。また、大気圏内飛行のために[[主翼]]もしくは[[リフティングボディ]]などの[[揚力]]発生機構を有する。
+
+かつては、実現すれば宇宙飛行の大幅なコスト減に繋がるとして期待されていたものの、[[スクラムジェットエンジン]]の開発が難航しており、[[2009年]]現在の技術では、飛行速度・高度に応じて何種類ものエンジンを搭載しなければならないこと、また大気圏外においてはロケットエンジンを使わざるを得ない。さらに現用のスペースシャトルですら使い捨て型ロケットより高コストになってしまったという事実により、懐疑的な見方がされている。
+
+スペースシャトルの後継の有人宇宙船は、使い捨て型ロケットを用いるカプセル型宇宙船の[[オリオン (宇宙船)|オリオン]]となった。[[ソユーズ]]の後継機として構想されている[[クリーペル]]は再使用型宇宙往還機ではあるものの、打ち上げ自体は使い捨て型ロケットを用いて行われる予定である。スペースプレーンの実用化の目処は全く立っていないというのが現状である。
+
+== 開発中および開発が中止されたスペースプレーン ==
+* [[日本]]
+: [[スペースプレーン#JAXAのスペースプレーン|JAXAのスペースプレーン]] - 研究中
+* [[アメリカ合衆国|アメリカ]]
+: [[X-30 (航空機)|X-30 NASP]] - 開発中止([[1986年]]~[[1994年]])
+: [[X-37 (航空機)|X-37]](1996年から) -無人研究機。 [[アメリカ航空宇宙局]]が手を引いたため、2006年以降は[[アメリカ空軍]]専属プロジェクトとなる。
+* [[イギリス]]
+: [[HOTOL]] - 研究中止([[1985年]]~[[1988年]])
+* [[ドイツ]]
+: [[ゼンガー (航空機)|ゼンガー]] - [[ナチス・ドイツ]]敗戦と共に研究中止([[1930年代]])
+: [[ゼンガー]] - 将来型欧州宇宙輸送調査計画 (FESTIP) に移行(1988年~1994年)
+
+== JAXAのスペースプレーン ==
+旧[[航空宇宙技術研究所|NAL]]はスペースプレーンの研究を行っており、[[2003年]]の[[宇宙航空研究開発機構|JAXA]]への統合後も研究は続けられている。このスペースプレーンには2006年現在も特別な名称が無く、単に「スペースプレーン」と呼ばれている。アメリカの[[X-30 (航空機)|NASP]]に似た形状の[http://web.archive.org/web/20060508064303/http://spaceinfo.jaxa.jp/note/rocket/j/roc13_j.html 想像図]や、スペースシャトルのような宇宙船を背負った二段式の[http://spaceinfo.jaxa.jp/ja/space_plane.html 想像図]が公開されている。
+また、旧[[宇宙科学研究所|ISAS]]で基礎研究が行われ、統合後も研究が続けられている[[ATREX]]においても、応用例として2段式スペースプレーンの想像図を示している。
+
+(詳細は、[[HOPE]]計画を参照)
+
+== フィクション ==
+映画[[2001年宇宙の旅]]の冒頭で登場する宇宙機オリオン号は、映画では宇宙空間からのシーンで始まるが、[[アーサー・C・クラーク]]の小説版ではブースターの母機に背負われてカタパルトで射出される描写が緻密に描かれている。
+
+== 関連項目 ==
+* [[ロケット]]
+* [[再使用型宇宙往還機]]
+* [[SSTO]]
+
+== 参考文献 ==
+* [[松浦晋也]]、『われらの有人宇宙船-日本独自の宇宙輸送システム「ふじ」-』、[[裳華房]]、[[2003年]]。
+: ISBN 4-7853-8758-0
+
+== 外部リンク ==
+* {{Wayback|url=spaceinfo.jaxa.jp/note/rocket/j/roc13_j.html|title=JAXA オンライン・スペースノート ロケット - スペースプレーン|date=20060508064303}} 
+
+[[Category:宇宙船|すへえすふれえん]]
+[[Category:スペースプレーン|*]]
+
+[[ca:Avió espacial]]
+[[cs:Kosmický raketoplán]]
+[[de:Raumflugzeug]]
+[[en:Spaceplane]]
+[[fr:Avion spatial]]
+[[lv:Kosmoplāns]]
+[[ru:Орбитальный самолёт]]
+[[sk:Kozmický raketoplán]]
+[[zh:太空飛機]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/ハイブリッドロケット.xml b/WptscsTest/Data/MediaWiki/ja/ハイブリッドロケット.xml
new file mode 100644 (file)
index 0000000..2d9d356
--- /dev/null
@@ -0,0 +1,105 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>ハイブリッドロケット</title>\r
+    <id>1382968</id>\r
+    <revision>\r
+      <id>34061707</id>\r
+      <timestamp>2010-09-18T11:13:43Z</timestamp>\r
+      <contributor>\r
+        <username>SieBot</username>\r
+        <id>126695</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[pl:Rakietowy silnik hybrydowy]]</comment>\r
+      <text xml:space="preserve">[[ファイル:SpaceShipOne schematic.png|thumb|[[スペースシップワン]]が使用したハイブリッドロケットエンジンの模式図。中央の燃焼室には固体燃料(黄色)がおかれている。右の圧力タンクから酸化剤(水色)が流れ込み、点火装置(赤)により点火される。生成した燃焼ガスは左のノズルから噴出される。]]
+'''ハイブリッドロケット''' ({{lang-en-short|hybrid rocket}}) は、[[相]]の異なる2種類の[[ロケットエンジンの推進剤|推進剤]]からなる[[ロケット]]エンジンシステムである。最も一般的なものは、固体燃料がおかれた燃焼室へ液体か気体の酸化剤を供給する事によって[[燃焼]]を起こし、生成したガスを噴射してその反動で進むというものである。
+
+このシステムは安全性・出力調整・再着火性・環境負荷の面で固体燃料推進より優れている。[[ハイブリッド]]システムは固体燃料よりも少し複雑だが、安全性の問題や、保存や運搬にまつわる問題が減ることでその欠点は補われている。
+
+最も単純なハイブリッドロケットの形式は加圧された酸化剤を満たしたタンクからバルブで制御されて燃焼室に導かれる。バルブが開かれて酸化剤が燃焼室内の燃料に送られ、点火されて燃焼が始まる。燃焼ガスはポートと呼ばれる燃焼室内の燃料間に形成された通路を通り、ノズルから噴出して反動で推力を生み出す。
+
+酸化剤には通常、気体か液体の酸素もしくは酸化窒素を使用する。燃料には[[ABS樹脂]]や合成ゴムなどが用いられる。
+
+== ハイブリッド式の安全性 ==
+うまく設計され、注意深く組み立てられたハイブリッドロケットの安全性は一般に高い。しかしながら、圧力容器が破損するなどした場合には破裂が発生することもありうる。
+
+燃料は単体では不活性であり、爆発することはない。また固体燃料ロケットと違い、燃料に亀裂があってもノズルを詰まらせない限りは安全である。
+
+推薬(推進剤)の組み合わせには "explosive equivalence" と呼ばれる危険性の指標が与えられることがある。これに推薬の重量をかけたものは同じ重量のTNT爆薬が機体を破壊する能力に相当する。固体燃料ロケットで100, 液体燃料ロケットで10から20であるのに対して、ハイブリッドロケットでは多くの場合0とされるが、爆発する危険が全くないわけではない(後述)。
+
+== ハイブリッド式の短所 ==
+ハイブリッドロケットの燃料と酸化剤の混合比の制御は固体燃料ロケットや液体燃料ロケットよりも正確性において劣る場合がある。というのは、燃焼が進行し、燃焼室内のポート(通路)の幅が広くなるにつれて、完全に反応することなくここを通り過ぎてしまう酸化剤の量が多くなってしまうためである。したがって多くのハイブリッドロケットでは燃焼の進行につれて酸化剤リッチになり、平均[[比推力]]を押し下げる要因となっている。また固体ロケットの燃焼後退速度と比較すると約1/3と遅い。
+
+== ハイブリッドをめぐる状況 ==
+1998年にSpaceDevは、200基以上のハイブリッドロケットの試射データを含むアメリカンロケット社の資産を取得した。SpaceDevは4.5kNから1.1MNまでに渡る各種の推力のハイブリッドロケットエンジンを試験した。SpaceDevが、世界最初の民間宇宙船である[[スペースシップワン]]向けに製造したモデルは、それまでに作られた中で最も大きなハイブリッドロケットであり、末端水酸基ポリブタジエン(HTPB)と液体亜酸化窒素(N2O)を使用した。
+
+反応研究学会 (RRS) は液体燃料ロケットについての仕事で知られているが、一方、ハイブリッドロケットによる推進に関する研究、及び、開発においても長い歴史を有する。
+
+2006年6月17日、カナダ宇宙学会 (CSS) での会合では気体酸素とアクリル燃料の組み合わせたハイブリッドロケットモーターの実演が行われた。
+モーターはトロント宇宙博物館のCSSの展示を担当するRobert Gissing, Daniel FaberとLuke Strasによって作られた。
+光学規格のアクリルのパイプは燃料と燃焼器としての役割があり、透明なアクリルのパイプを透して内部で燃焼する様子を見ることが出来るようになっている。燃焼の様子は公開されている&lt;ref&gt;{{YouTube|fd83qF1x7Y8|hybrid rocket motor}}&lt;/ref&gt;。
+
+2007年7月27日午前(日本時間)、スペースシップワンを開発したスケールドコンポジット社がアメリカ・カリフォルニア州のモハーベ空港で宇宙船用のハイブリッドロケットエンジンの試験をしていたところ、爆発事故が発生し、3人が死亡、3人が重傷を負った。
+
+日本では、[[北海道大学]]などの産学協同グループが[[CAMUIロケット]]を開発している。CAMUIは燃料ブロックを複数の段(ステージ)に分け、段ごとにポートの位置をずらすことによって反応効率を上げ、小型ながら高推力を実現している。2002年から2007年末まで数回の打ち上げ実験が行われ、うち1回を除いて成功した。
+
+== 脚注 ==
+{{脚注ヘルプ}}
+{{reflist}}
+
+== 関連項目==
+* [[ロケット]]
+* [[ロケットエンジン]]
+* [[モデルロケット]]
+
+== 外部リンク ==
+* [http://www.aspirespace.org.uk/aspireold/TechSeries/Introduction%20to%20hybrid%20design.pdf Aspirespace Introduction to hybrid design]
+* [http://psas.pdx.edu/HybridLinks Portland State Aerospace Society paraffin hybrid links]
+* [http://www.c-turbines.ch Hybridrocket, Private page (in German)]
+
+{{DEFAULTSORT:はいふりつとろけつと}}
+
+[[Category:化学推進]]
+[[Category:ハイブリッド]]
+
+[[de:Hybridrakete]]
+[[en:Hybrid rocket]]
+[[fi:Hybridiraketti]]
+[[fr:Propulsion hybride (fusée)]]
+[[it:Razzo ibrido]]
+[[pl:Rakietowy silnik hybrydowy]]
+[[pt:Foguete de combustível híbrido]]
+[[ru:Гибридный ракетный двигатель]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/ホワイトナイトツー.xml b/WptscsTest/Data/MediaWiki/ja/ホワイトナイトツー.xml
new file mode 100644 (file)
index 0000000..7624b1b
--- /dev/null
@@ -0,0 +1,186 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>ホワイトナイトツー</title>\r
+    <id>1757090</id>\r
+    <revision>\r
+      <id>31228488</id>\r
+      <timestamp>2010-03-26T16:41:51Z</timestamp>\r
+      <contributor>\r
+        <username>Luckas-bot</username>\r
+        <id>225041</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[zh:白色骑士2号]]</comment>\r
+      <text xml:space="preserve">{{Infobox 航空機
+| 名称=ホワイトナイトツー
+| 画像=ファイル:Vg-wk2-080728 (148) cr8.jpg
+| キャプション=2008年7月28日に行われたホワイトナイトツーのロールアウトと命名の式典
+| 用途=輸送機
+| 分類=
+| 設計者=[[バート・ルータン]]と[[ボブ・モーガン]]&lt;ref&gt;{{cite web
+  | title = WK2 Rollout Audio Clips (parts 4 &amp; 6)
+  | work = Movaje Skies
+  | date = [[2008年]][[7月30日]]
+  | url = http://mojaveskies.blogspot.com/2008/07/wk2-rollout-audio-clips.html
+  | accessdate = 2009-03-10 }}&lt;/ref&gt;
+| 製造者=[[スケールド・コンポジッツ]]
+| 運用者=
+| 初飛行年月日=[[2008年]][[12月21日]]
+| 生産数=
+| 生産開始年月日=
+| 運用開始年月日=
+| 退役年月日=
+| 運用状況=
+| ユニットコスト=  
+}}
+
+[[File:VMS Eve Maiden Flight.jpg|thumb|2008年12月21日に行われたVMS Eveの初飛行]]
+[[File:Vg-wk2-080728 (153) cr8.jpg|thumb|VMS Eveの機首のデザイン]]
+[[File:Vg-wk2-080728 (2) cr8.jpg|thumb|ホワイトナイトツーで使用された[[プラット・アンド・ホイットニー・カナダ PW300|PW308]]]]
+
+'''スケールド・コンボジッツ モデル348 ホワイトナイトツー (Scaled Composites Model 348 WhiteKnightTwo, WK2)'''は、[[スペースシップツー]][[宇宙船]]を発射するために使用される、輸送用のジェット[[航空機]]である。これは[[スケールド・コンポジッツ]]によって、二段階の有人弾道飛行発射システムである[[Tier 1b]]の第一段階として開発された。ホワイトナイトツーは、[[スペースシップワン]]の母艦である[[ホワイトナイト (航空機)|ホワイトナイト]](これは[[スケールド・コンポジッツ プロテウス|プロテウス]]に基づいて開発された)の成功に基づいている。
+
+[[ヴァージン・ギャラクティック]]は2機のホワイトナイトツーを発注済みである&lt;ref&gt;{{cite web |url=http://www.space.com/news/080123-virgingalactic-ss2-design.html |title=Virgin Galactic Unveils Suborbital Spaceliner Design |accessdate=2008-01-25 |date=[[2008年]][[1月23日]] |first=Tariq |last=Malik |publisher=''SPACE.com''}}&lt;/ref&gt;。ホワイトナイトツーとスペースシップツーは、ヴァージン・ギャラクティックが行う弾道飛行で使用されるスペースプレーンのベースとなっている。
+
+最初のホワイトナイトツーは[[リチャード・ブランソン]]の母に因んで[[VMS Eve|VMS ''Eve'']]と名づけられた。これは[[2008年]][[7月28日]]に公式に公開され、[[2008年]][[12月21日]]に初飛行を行った。二番目のホワイトナイトツーは、ブランソンの親しい友人である[[スティーヴ・フォセット]]に因んで[[VMS Spirit of Steve Fossett|VMS ''Spirit of Steve Fossett'']]と名づけられる予定である。&lt;ref&gt;{{cite web |first=Ari |last=Burack |url=http://www.sanfranciscosentinel.com/?p=5903 |title=Sir Richard Branson... |accessdate=2008-02-28 |publisher=''San Francisco Sentinel'' |date=[[2007年]][[10月10日]]}}&lt;/ref&gt;&lt;ref&gt;{{cite web |url=http://newsfromrussia.com/news/science/23-01-2008/103605-spacecraft-0 |title=Spaceship Company unveils design of SpaceShipTwo |accessdate=2008-01-25 |date=[[2008年]][[1月23日]] |publisher=''[[Pravda Online]]''}}&lt;/ref&gt;
+
+== 設計 ==
+ホワイトナイトツーは、大型の[[スペースシップツー]]宇宙船を輸送([[:en:captive carry]])するために、[[ホワイトナイト (航空機)|ホワイトナイト]]に比べておよそ3倍の大きさがある。&lt;ref&gt;{{cite web |url=http://www.thespacereview.com/article/943/1 |title=Something dangerous and new |accessdate=2007-08-28 |date=[[2007年]][[8月28日]] |publisher=thespacereview.com}}&lt;/ref&gt; ホワイトナイトツーは、[[B-29 (航空機)|B-29 スーパーフォートレス]]と同程度の[[翼幅]]である。大きさの比較とは関係なく、ホワイトナイトツーは完全に最新の航空機である。フライトコントロールケーブルでさえ、カーボンファイバー製の、新しく特許を受けた設計である。&lt;ref&gt;[http://www.space.com/businesstechnology/080606-virgin-mother.html David, Leonard. "Virgin Galactic Spaceline: Mega-Mothership Set for Rollout Debut". Space.com [[2008年]][[6月6日]]]&lt;/ref&gt;
+
+実際の弾道飛行の前に、ホワイトナイトツーは数秒間の[[無重力状態]]を体験できる、プレビュー飛行を行う。ホワイトナイトツーは、およそ60,000フィート(18km)の実用上限高度を持つことを意図しており、乗客にダークブルーの空を提供する。これにより、乗客は本当の飛行の前に訓練を行うことが出来る。&lt;ref&gt;{{cite web |url=http://www.space.com/news/060811_rutan_interview.html |title=Burt Rutan on Civilian Spaceflight, Breakthroughs, and Inside SpaceShipTwo |accessdate=2007-08-25 |date=[[2006年]][[8月11日]] |author=Leonard David |publisher=Space.com }}&lt;/ref&gt;
+
+ホワイトナイトツーは[[双胴機]]であり、それぞれの機体に2つずつの[[ジェットエンジン]]を持つ。&lt;ref&gt;{{cite book |author=Kenny Kemp |title=Destination Space |month=March | year=2007 |publisher=[[Virgin Books]] }}&lt;/ref&gt;ひとつの機体はスペースシップツーの正確なレプリカである(乗客の訓練を行うため)。もうひとつの機体は、割引料金の日帰り旅行客を成層圏へ運ぶためのものである。&lt;ref&gt;{{cite web |url=http://www.wired.com/science/space/magazine/15-06/ff_space_virgin |title=Burt Rutan and Richard Branson Want You to Hit Space in High Style |accessdate=2007-08-25 |date=[[2007年]][[5月22日]] |author= Spencer Reiss |publisher=Wired.com }}&lt;/ref&gt;
+
+ホワイトナイトツーの設計は、サイズ・尾翼・エンジンの構成・コクピットの配置など、ホワイトナイトと完全に異なる。ホワイトナイトは2つのT字尾翼であったが、ホワイトナイトツーは2つの十字尾翼である。エンジンの構成も大きく異なっている。ホワイトナイトツーではエンジンを翼の下に吊り下げているが、ホワイトナイトでは唯一のコクピットの両側に配置していた。
+
+== 仕様 ==
+{{航空機スペック
+
+|固定翼 or 回転翼?=固定翼
+|ジェット or プロペラ?=ジェット
+
+|出典=&lt;ref&gt;{{cite web |url=http://www.pwc.ca/en/0_0/0_0_8/0_0_8_1_1_1.asp?id_news=454 |title=Pratt &amp; Whitney Canada PW308 Engine to Power Virgin Galactic's Suborbital Spaceship Launcher |accessdate=2007-08-25 |date=[[2007年]][[7月11日]] |publisher=Pratt &amp; Whitney Canada }}&lt;/ref&gt;&lt;ref&gt;{{cite web |url=http://www.brightcove.tv/title.jsp?title=1119231942&amp;channel=627008079 |title=Virgin Galactic presentation Oshkosh Theater in the Woods 2007 |accessdate=2007-09-22 |date=[[2007年]][[7月22日]] | author= Will Whitehorn and Alex Tai |publisher=BrightCove.TV }}&lt;/ref&gt;
+
+|乗員=
+|定員=
+|ペイロード SI= 17,000 kg &lt;ref name="flight319910"&gt;{{cite web |url=http://www.flightglobal.com/articles/2008/12/09/319910/virgin-galactic-in-spaceshipthree-talks.html |title=Virgin Galactic in SpaceShipThree talks |accessdate=2008-12-09 |date=[[2008年]][[12月9日]] | author= Rob Coppinger |publisher=Flightglobal }}&lt;/ref&gt;
+|ペイロード fp=
+|全長 SI= 24m
+|全長 fp= 79ft
+&lt;!-- 翼長・全幅 --&gt;
+|スパン SI= 43m
+|スパン fp= 141ft
+|全高 SI= m
+|全高 fp= ft
+|面積 SI= m&lt;sup&gt;2&lt;/sup&gt;
+|面積 fp= ft&lt;sup&gt;2&lt;/sup&gt;
+|翼型=
+|空虚重量 SI= kg
+|空虚重量 fp= lb
+|運用時重量 SI= kg
+|運用時重量 fp= lb
+|有効搭載量 SI= kg
+|有効搭載量 fp= lb
+|最大離陸重量 SI= kg
+|最大離陸重量 fp= lb
+|その他の諸元=
+
+|エンジン名(ジェット)=[[プラット・アンド・ホイットニー・カナダ PW300|プラット・アンド・ホイットニー・カナダ PW308]]
+|エンジン種類(ジェット)=[[ターボファン]]
+|エンジン数(ジェット)=4
+|推力 SI= kN
+|推力 fp= lbf
+|推力 original=
+|推力 more=
+|アフターバーナー作動時 推力 SI= kN
+|アフターバーナー作動時 推力 fp= lbf
+|エンジン名(プロペラ)=
+|エンジン種類(プロペラ)=&lt;!--レシプロ/ターボプロップ/ターボシャフト/など--&gt;
+|エンジン数(プロペラ)=&lt;!--1つなら1と書くこと--&gt;
+|出力 SI= kW
+|出力 fp= hp
+|出力 original=&lt;!--出典にある数値と単位--&gt;
+|出力 more=
+
+|最大速度 SI= km/h
+|最大速度 fp= kt
+|最大速度 more=
+|巡航速度 SI= km/h
+|巡航速度 fp= kt
+|巡航速度 more=
+|失速速度 SI= km/h
+|失速速度 fp= kt
+|失速速度 more=
+|超過禁止速度 SI= km/h
+|超過禁止速度 fp= kt
+|航続距離 SI= km
+|航続距離 fp= 海里
+|航続距離 more=
+|フェリーレンジ SI= km
+|フェリーレンジ fp= 海里
+|フェリーレンジ more=
+|上昇限度 SI= 21.3 km
+|上昇限度 fp= 70,000 ft
+|上昇率 SI= m/min
+|上昇率 fp= ft/s
+|翼面(円板)荷重 SI= kg/m&lt;sup&gt;2&lt;/sup&gt;
+|翼面(円板)荷重 fp= lb/ft&lt;sup&gt;2&lt;/sup&gt;
+|推力重量比= &lt;!--計算して無次元数にする--&gt;
+|馬力荷重 SI= kW/kg
+|馬力荷重 fp= hp/lb
+|最大馬力荷重 SI=
+|最大馬力荷重 fp=
+|最大推力重量比=
+}}
+
+
+== 参照 ==
+{{Reflist}}
+
+== 外部リンク ==
+*[http://news.bbc.co.uk/2/hi/in_pictures/7530070.stm   BBC - In pictures: Space tourism jet]
+*[http://www.educatedearth.net/video.php?id=3785 Video of White Knight Two being unveiled]
+*[http://travel.latimes.com/daily-deal-blog/index.php/virgin-galatic-space-2379/  Photos of Virgin Galactic’s White Knight Two unveiling]
+
+{{DEFAULTSORT:ほわいとないとつう}}
+[[Category:航空機]]
+
+[[de:White Knight Two]]
+[[en:Scaled Composites White Knight Two]]
+[[fr:White Knight Two]]
+[[hu:WhiteKnightTwo]]
+[[sv:White Knight 2]]
+[[zh:白色骑士2号]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/ポール・アレン.xml b/WptscsTest/Data/MediaWiki/ja/ポール・アレン.xml
new file mode 100644 (file)
index 0000000..21921d7
--- /dev/null
@@ -0,0 +1,159 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>ポール・アレン</title>\r
+    <id>143204</id>\r
+    <revision>\r
+      <id>34037206</id>\r
+      <timestamp>2010-09-17T03:42:53Z</timestamp>\r
+      <contributor>\r
+        <username>F-mikanBot</username>\r
+        <id>444844</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる: 良質な記事へのリンク [[en:Paul Allen]]</comment>\r
+      <text xml:space="preserve">{{Infobox 人物
+ | name        = ポール・アレン&lt;br /&gt;''Paul Allen''
+ | image       = Paull Allen.JPG
+ | imagesize   = 225px
+ | caption     = 
+ | birth_date  = {{生年月日と年齢|1953|1|21}}
+ | birth_place = {{USA}}&lt;br /&gt;[[ワシントン州]][[マーサーアイランド]]([[シアトル]]近郊)
+ | death_date  = 
+ | death_place = 
+ | occupation  = [[実業家]]
+ | salary      = 
+ | networth    = 105億ドル([[2009年]]時点)&lt;ref&gt;{{cite web|url=http://www.forbes.com/lists/2009/10/billionaires-2009-richest-people_Paul-Allen_1217.html|title=#32 Paul Allen|date=2009年3月11日|accessyear=2009年|accessdate=11月28日|author=[[フォーブス (雑誌)|フォーブス]]}}&lt;/ref&gt;
+ | spouse      =
+ | website     =
+ | footnotes   = 
+}}
+'''ポール・ガードナー・アレン'''(Paul Gardner Allen, [[1953年]][[1月21日]] - )は、[[マイクロソフト]]社の共同創業者。[[1983年]]に退社し、[[1990年]]に復帰するが、[[2000年]]に再び退社、[[取締役]]も退任。現在は[[資産運用]]や[[投資]]を業務とする[[バルカン]]社を経営している。
+
+大資産家として知られており、6つの財団を傘下に率いるポール・G・アレン財団を運営している。また、アレン脳科学研究所や音楽史美術館 Experience Music Project など様々な事業に出資や寄付をしている。[[サイエンス・フィクション|SF]] ファンとしても知られ、私財を投じて SF 博物館 Science Fiction Museum and Hall of Fame を設立したほか、[[SETI@home]] にも寄付を行っている。
+
+[[アメリカ合衆国|アメリカ]]の[[アメリカンフットボール]]プロリーグ([[NFL]])の[[シアトル・シーホークス]]、プロ[[バスケットボール]]リーグ([[NBA]])の[[ポートランド・トレイルブレイザーズ]]、プロ[[サッカー]]リーグ([[メジャーリーグサッカー|MLS]])の[[シアトル・サウンダーズFC]]のオーナーとしても知られる。
+
+== 経歴 ==
+[[アメリカ合衆国]]・[[ワシントン州]][[シアトル]]生まれ。父は司書。シアトルの名門私立学校、レイクサイド中学・高校で[[ビル・ゲイツ]]と知り合い、[[1968年]]に同校が導入した [[ディジタル・イクイップメント・コーポレーション|DEC]] 社の [[PDP-10]] を使用してコンピュータの魅力に取り憑かれる。[[1970年]]にゲイツと共にレイクサイド・プログラマーズ・グループを結成、ISI 社から給与計算システムの開発を受注。高校生の時にゲイツと共にトラフォデータ社を設立、独自に開発した交通量分析システムを州政府に納入した。卒業後は[[ワシントン州立大学 (プルマン)|ワシントン州立大学]]に進学するが、2年後に中退し[[ボストン]]の[[ハネウェル]]社にプログラマーとして勤務する。
+
+[[1975年]]、[[ハーバード大学]]に在籍していたゲイツを説得し、[[ニューメキシコ州]][[アルバカーキ]]にてマイクロソフト社を設立。[[BASIC]] [[インタプリタ]]の販売を開始する。[[1980年]]に [[IBM]] 社から OS 開発の要請を受け、アレンは[[シアトル・コンピュータ・プロダクツ]]社から 86-DOS([[QDOS]])を50,000米ドルで買収する交渉の先頭に立った。彼らは 86-DOS を原型に PC-DOS([[MS-DOS]])を開発し IBM へ納入し、今日のマイクロソフト社の成長の基盤を築いていった。
+
+[[1983年]]に持病である[[ホジキンリンパ腫|ホジキン病]]を理由にマイクロソフト社を退社。数か月に渡る[[放射線療法|放射線治療]]と[[骨髄移植]]で克服し、[[1985年]]には[[:en:Asymetrix|アシンメトリックス社]]を設立し自ら社長に就任した。その後ホジキン病という診断がそもそも[[誤診]]であることが判明したため[[1990年]]にマイクロソフトに復帰するも、[[2000年]]11月には再びマイクロソフトを退社し[[取締役]]も退任。
+
+[[1998年]]には米国の大手[[CATV]]会社である[[チャーター・コミュニケーションズ]]の株式を買収して筆頭株主となり、自らも同社の会長に就任したが、同社はその後経営不振に陥っており、2009年2月現在[[連邦倒産法第11章]]の申請を準備中である&lt;ref&gt;[http://www.nikkei.co.jp/news/kaigai/20090213AT2M1301A13022009.html 米CATV大手のチャーターが破産法申請へ] - NIKKEI NET&lt;/ref&gt;。また[[2008年]]1月に行われた米国の700MHz帯の競売にも「バルカン・スペクトラム」として参加し、シアトルなど2か所の免許を得ている。
+
+ポール・アレンの姉妹でバルカン社CEOのジョディ・アレンは2009年11月16日、ポールが[[非ホジキンリンパ腫]]と診断されたと発表した&lt;ref&gt;{{cite news|first=Ina|last=Fried|date=2009-11-16|url=http://news.cnet.com/8301-13860_3-10399143-56.html|title=Paul Allen diagnosed with cancer|publisher=[[CNET]]|accessdate=2009-11-28}}&lt;/ref&gt;。
+
+== 慈善活動 ==
+[[ファイル:Ansari_X-Prize_Check.jpg|thumb|right|250px|ポール・アレン(右から3番目)、[[Ansari X Prize]] 優勝賞金1,000万ドルの贈呈式にて(2004年11月6日)]]
+マイクロソフト退社後は慈善事業に参入し、[[1986年]]に慈善団体のポール・G・アレン一族財団を創設した。以来毎年3,000万米ドルを太平洋岸北西地域の民間非営利組織に分配している。[[2003年]]9月には私財1億米ドルを投じてアレン脳科学研究所を設立し、マウス脳[[遺伝子発現]]マップ作成プロジェクト Allen Brain Atlas を開始した。[[2004年]]に [[Ansari X Prize]] を受賞した有人宇宙船 [[スペースシップワン|SpaceShipOne]] にも出資した。
+
+1980年代後半、[[ワシントン大学 (ワシントン州)|ワシントン大学]]に1800万米ドルを寄付し、アレンの父の名を冠した図書館 Kenneth S. Allen Library が建設された。[[2002年]]にも1400万米ドルを寄付し、ポール・アレンの名を冠した Paul G. Allen Center for Computer Science &amp; Engineering が新設された。[[2003年]]にも500万米ドルを寄付し、アレンの母の名を冠した Faye G. Allen Center for Visual Arts が設立された。
+
+[[ハナアブ]]の一種である[[ポールアレンハナアブ]]は、[[ハエ目|双翅目]]学に対する貢献から彼に[[献名]]されたものである&lt;ref&gt;{{cite web|first=Jennifer E.|last=Fairman|date=1999-08-19|url=http://www.sel.barc.usda.gov/Diptera/syrphid/allen.htm|title=Paul Allen's Flower Fly|publisher=[[アメリカ合衆国農務省]]|accessdate=2009-11-28}}&lt;/ref&gt;。
+
+== スポーツへの関わり ==
+[[1988年]]にプロ[[バスケットボール]]リーグ([[NBA]])の[[ポートランド・トレイルブレイザーズ]]を7000万米ドルで購入し、[[1993年]]に2億6200万米ドルの資金を投入して本拠地[[ローズ・ガーデン・アリーナ]]を建設した。[[1997年]]には[[アメリカンフットボール]]プロリーグ([[NFL]])の[[シアトル・シーホークス]]を購入し、本拠地[[クエスト・フィールド]]の建設に大きな役割を果たした。また、メジャーリーグサッカーのシアトル・サウンダーズFCのオーナーとしてクラブの運営に関わっている。
+
+== 脚注・出典 ==
+{{脚注ヘルプ}}
+{{reflist}}
+
+== 外部リンク ==
+* [http://www.paulallen.com/ PaulAllen.com]
+* [http://www.vulcan.com/ バルカン社のWEBサイト]
+* [http://www.pgafoundation.com/ ポール・G・アレン財団]
+* [http://www.pgafamilyfoundation.org/ ポール・G・アレン一族財団]
+* [http://www.brainatlas.org/ アレン脳科学研究所]
+* [http://www.europaluxury.com/yacht/shipyard/luerssen.html Allen's Octopus Yacht]
+* [http://www.emplive.com/ Experience Music Project]
+* [http://www.sfhomeworld.org/ Science Fiction Museum and Hall of Fame]
+* [http://hotwired.goo.ne.jp/news/news/technology/story/20040325307.html ポール・アレン氏、宇宙人探索に1350万ドルを寄付(HotWired Japan)]
+&lt;!--* [http://www.europaluxury.com/Section/Boats/LUERSSEN.html Paul Allen's Yacht shipyard]←リンク切れ--&gt;
+
+{{マイクロソフト}}
+{{DEFAULTSORT:あれん ほる}}
+[[Category:アメリカ合衆国の実業家]]
+[[Category:アメリカ合衆国のサッカークラブの代表者]]
+[[Category:マイクロソフトの人物]]
+[[Category:NBAのオーナー]]
+[[Category:ポートランド・トレイルブレイザーズ]]
+[[Category:NFLのオーナー]]
+[[Category:シアトル・シーホークス]]
+[[Category:シアトル出身の人物]]
+[[Category:1953年生]]
+[[Category:存命人物]]
+{{Link GA|en}}
+
+[[ar:بول ألين]]
+[[bg:Пол Алън]]
+[[bn:পল অ্যালেন]]
+[[br:Paul Allen]]
+[[ca:Paul Allen]]
+[[cs:Paul Allen]]
+[[da:Paul Allen]]
+[[de:Paul Allen]]
+[[el:Πολ Άλεν]]
+[[en:Paul Allen]]
+[[eo:Paul Allen]]
+[[es:Paul Allen]]
+[[fa:پل آلن]]
+[[fi:Paul Allen]]
+[[fr:Paul Allen]]
+[[gl:Paul Allen]]
+[[he:פול אלן]]
+[[id:Paul Allen]]
+[[it:Paul Allen]]
+[[ka:პოლ ალენი]]
+[[ko:폴 앨런]]
+[[ml:പോൾ അല്ലൻ]]
+[[mt:Paul Allen]]
+[[nl:Paul Allen]]
+[[nn:Paul Allen]]
+[[no:Paul Allen]]
+[[pam:Paul Allen]]
+[[pl:Paul Allen]]
+[[pt:Paul Allen]]
+[[ro:Paul Allen]]
+[[ru:Аллен, Пол]]
+[[simple:Paul Allen]]
+[[sk:Paul Allen]]
+[[sr:Пол Ален]]
+[[sv:Paul Allen]]
+[[tr:Paul Gardner Allen]]
+[[uk:Аллен Пол]]
+[[vi:Paul Allen]]
+[[zh:保罗·艾伦]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/モハーヴェ・エアロスペース・ベンチャーズ.xml b/WptscsTest/Data/MediaWiki/ja/モハーヴェ・エアロスペース・ベンチャーズ.xml
new file mode 100644 (file)
index 0000000..a4f56a8
--- /dev/null
@@ -0,0 +1,32 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/モハーヴェ空港.xml b/WptscsTest/Data/MediaWiki/ja/モハーヴェ空港.xml
new file mode 100644 (file)
index 0000000..8616cc6
--- /dev/null
@@ -0,0 +1,134 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>モハーヴェ空港</title>\r
+    <id>914777</id>\r
+    <revision>\r
+      <id>31841433</id>\r
+      <timestamp>2010-04-29T17:31:21Z</timestamp>\r
+      <contributor>\r
+        <username>Ajtnk</username>\r
+        <id>18368</id>\r
+      </contributor>\r
+      <comment>/* 「飛行機の墓場」 */</comment>\r
+      <text xml:space="preserve">{| class="infobox bordered" style="width: 200px; font-size:100%;"
+|-
+! colspan="4" style="text-align: center; background-color: #4682B4; color: white;" |モハーヴェ空港 &amp; 宇宙港&lt;br/&gt;Mojave Airport &amp; Spaceport&lt;br/&gt;[[画像:Mhv-031118-area3-31cr-8.jpg|300px|駐機されている旅客機]]
+|-
+!align="center" colspan="4"|&lt;small&gt;IATA:MHV - ICAO:KMHV&lt;/small&gt;
+|-
+!colspan="4" style="text-align: center; background-color: #4682B4; color: white;" |概略
+&lt;tr&gt;&lt;th colspan="2" align="left" valign="top"&gt;&lt;small&gt;空港種別&lt;/small&gt;&lt;/th&gt;&lt;td colspan="2" valign="top"&gt;&lt;small&gt;民間&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;th colspan="2" align="left" valign="top"&gt;&lt;small&gt;航空管制&lt;/small&gt;&lt;/th&gt;&lt;td colspan="2" valign="top"&gt;&lt;small&gt;CIVIL &lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
+|-
+!colspan="2" align="left" valign="top"|&lt;small&gt;海抜&lt;/small&gt;
+|colspan="2" valign="top"|&lt;small&gt;2,791ft(851m)&lt;/small&gt;
+|-
+!colspan="2" align="left" valign="top"|&lt;small&gt;位置&lt;/small&gt;
+|colspan="2" valign="top"|&lt;small&gt;{{ウィキ座標度分秒|35|03|34|N|118|09|07|W|}}&lt;/small&gt;
+|-
+!colspan="4" style="text-align: center; background-color: #4682B4; color: white;" |滑走路
+|-
+!bgcolor="lightgrey" rowspan="2"|&lt;small&gt;方向&lt;/small&gt;
+!bgcolor="lightgrey" colspan="2"|&lt;small&gt;全長&lt;/small&gt;
+!bgcolor="lightgrey" rowspan="2"|&lt;small&gt;表面&lt;/small&gt;
+|-
+!bgcolor="lightgrey"|&lt;small&gt;ILS&lt;/small&gt;
+!bgcolor="lightgrey"|&lt;small&gt;m×幅&lt;/small&gt;
+|-
+!align="left" valign="top"|&lt;small&gt;12/30&lt;/small&gt;
+|valign="top"|&lt;small&gt;NO&lt;/small&gt;
+|valign="top"|&lt;small&gt;2,896×61&lt;/small&gt;
+|valign="top"|&lt;small&gt;[[アスファルト|舗装]]&lt;/small&gt;
+|-
+!align="left" valign="top"|&lt;small&gt;08/26&lt;/small&gt;
+|valign="top"|&lt;small&gt;NO&lt;/small&gt;
+|valign="top"|&lt;small&gt;2,149×30&lt;/small&gt;
+|valign="top"|&lt;small&gt;[[アスファルト|舗装]]&lt;/small&gt;
+|-
+!align="left" valign="top"|&lt;small&gt;04/22&lt;/small&gt;
+|valign="top"|&lt;small&gt;NO&lt;/small&gt;
+|valign="top"|&lt;small&gt;1,446×15&lt;/small&gt;
+|valign="top"|&lt;small&gt;[[アスファルト|舗装]]&lt;/small&gt;
+|}
+
+'''モハーヴェ空港 &amp; 宇宙港''' ('''Mojave Airport &amp; Spaceport''')は、[[アメリカ合衆国|アメリカ]]の[[カリフォルニア州]]、[[モハーヴェ (カリフォルニア州)|モハーヴェ]]にある[[空港]]である。
+
+== 概要 ==
+===実験及び開発拠点===
+[[1935年]]に開港し、[[第二次世界大戦]]中の[[1942年]]に[[アメリカ海兵隊|海兵隊]]の訓練基地となった。その後[[1972年]]に民間に運営が戻され、軍民問わず様々な[[航空機]]の実験及び開発の拠点として運営されている。
+
+3本の滑走路を持つ大規模な空港であり、[[旅客機]]をはじめとした航空機の整備の施設や訓練施設も置かれているが、[[1980年代]]より定期便の運航はないこともあり、旅客ターミナルは置かれていない。周辺は[[モハーヴェ砂漠]]で、廃棄予定の航空機の駐機場の地面も砂漠の上である。
+
+===「宇宙港」===
+[[File:Spaceship One and White Knight side view.jpg|thumb|right|220px|ヴァージン社の宇宙船]]
+[[File:Ansett-767-N407AN-070405-01-12.jpg|thumb|right|220px|解体された[[アンセット・オーストラリア航空]]の[[ボーイング767]]-300]]
+モハーヴェ空港は、[[イギリス]]の[[ヴァージン・グループ]]傘下の[[ヴァージン・ギャラクティック]]社と、航空機開発を行う[[スケールド・コンポジッツ]]社による、宇宙旅行の宇宙船の開発拠点が置かれていることでも知られ、「Airport(空港)」と同時に、「Spaceport(宇宙港)」という名前となっている。
+
+===「飛行機の墓場」===
+また現在は、他社への売却の途上で一時的に保管されたり、経年化により廃棄される予定の[[航空機]]を留置する空港として世界的に有名で、常時百機以上の[[旅客機]]が保管されている。
+
+現在は、[[マクドネル・ダグラス]][[DC-9]]や[[DC-10]]、[[ボーイング747]]-100/200/300や[[ボーイング737]]-200/300、[[エアバスA300]]や[[BAe 146]]などの機齢25-35年程度の経年機が多く保管、もしくは廃棄待ちされており、中には[[ダグラス]][[DC-8]]や[[ボーイング707]]、[[ボーイング727]]などの[[1960年代]]に製造された機体や、[[1980年代]]に製造された[[ボーイング757]]や[[ボーイング767]]、[[エアバスA310]]や[[エアバスA320]]などの比較的新しい機体も保管、もしくは廃棄待ちされている。
+
+そのため、「'''飛行機の墓場'''」との異名を持ち、世界中から旅客機や軍用機マニアが多く集まる。また、広大な敷地とロサンゼルス市内から100キロ程度というアクセスの利便性の高さから、「[[ダイ・ハード2]]」や「[[S.W.A.T.]]」、「[[24]]」など、様々な[[映画]]や[[テレビ]]シリーズの撮影場所としても使用されている。
+
+==その他の施設==
+[[File:Ifta-a36-N812AD-071115-01-16.jpg|thumb|right|220px|IFTAのビーチクラフトA36]]
+===訓練設備===
+[[全日本空輸]]の[[パイロット]]の訓練施設「International Flight Training Academy:IFTA(Base APO: [[Meadows Field Airport]])」の訓練で利用する空港の一つで、全日空の塗装を施された[[ビーチクラフト]]A36「ボナンザ」が飛行訓練で訪れることがある。なおモハーヴェ空港内には、廃棄処分となる全日空の塗装を施された機材が保管されている。
+
+===ゲートガード===
+モハーヴェ空港のゲートガードとして、空港入り口に空港の[[ロゴ]]が入った[[コンベア990]]型機が駐機している。なおこの機材は[[アメリカ航空宇宙局|NASA]]で実験機として使用されていたもので、世界でも数少ない原形をとどめるコンベア990型機の1つである。
+
+== 交通 ==
+===車===
+カリフォルニア州内の[[ロサンゼルス]]市内からは約100km圏内にある。ロサンゼルスから、[[州間高速道路5号線]]を北上、途中のジャンクションから[[カリフォルニア州道14号線]]に入り、しばらくしてまた[[カリフォルニア州道58号線]]に乗り換えてしばらくたったところにある。
+
+==宿泊施設==
+「モーテル8」など複数の[[ホテル]]が空港周辺にある他、空港周辺には複数の[[レストラン]]や「[[サブウェイ]]」などの[[ファストフード]]店もいくつか存在する。
+
+== 参考文献 ==
+*[[FLY! FLY! FLY!]]
+** 「飛行機の墓場 モハベ空港」 (DVD)、ポニーキャニオン
+
+== 関連項目 ==
+*[[デビスモンサン空軍基地]] - 飛行機の墓場としてモハーヴェと同様に著名。退役した軍用機が大量に保管されている
+
+{{airport-info|KMHV}}
+[[Category:カリフォルニア州の空港|もはあへくうこう]]
+[[Category:グレイト・ベイスン|もはあへくうこう]]
+
+[[de:Mojave Air &amp; Space Port]]
+[[en:Mojave Air and Space Port]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/リチャード・ブランソン.xml b/WptscsTest/Data/MediaWiki/ja/リチャード・ブランソン.xml
new file mode 100644 (file)
index 0000000..dfefd2b
--- /dev/null
@@ -0,0 +1,154 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>リチャード・ブランソン</title>\r
+    <id>241522</id>\r
+    <revision>\r
+      <id>33807212</id>\r
+      <timestamp>2010-09-02T13:57:29Z</timestamp>\r
+      <contributor>\r
+        <username>VolkovBot</username>\r
+        <id>105371</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[uk:Річард Бренсон]]</comment>\r
+      <text xml:space="preserve">{{Infobox 人物
+ | name        = サー・リチャード・チャールズ・&lt;br /&gt;ニコラス・ブランソン
+ | image       = Richard Branson.jpg
+ | imagesize   = 225px
+ | caption     = サー・リチャード・チャールズ・ニコラス・ブランソン
+ | birth_date  = {{生年月日と年齢|1950|07|18}}
+ | birth_place = {{UK}}、[[サリー (イングランド)|サリー]]、シャムリー・グリーン
+ | death_date  = 
+ | death_place = 
+ | occupation  = [[ヴァージン・グループ]]会長
+ | salary      = 
+ | networth    = 
+ | spouse      = 
+ | website     =
+ | footnotes   = 
+ }}
+'''サー・リチャード・チャールズ・ニコラス・ブランソン'''({{lang|en|Sir Richard Charles Nicholas Branson}}, [[1950年]][[7月18日]] &amp;ndash;)は、[[イギリス]]の[[実業家]]。[[コングロマリット (ビジネス)|コングロマリット]]、[[ヴァージン・グループ]]の創設者で会長を務める。
+
+==プロフィール==
+===生い立ち===
+[[1950年]]に、[[ロンドン]]郊外の[[サリー (イングランド)|サリー]]、シャムリー・グリーンの中流家庭に生まれた。幼い頃は[[ディスレクシア]]に悩まされていたことを公言している。17歳のときに[[パブリックスクール]]を中退し、「Student」という名の雑誌を創刊した。
+
+なお、大資産家の家に嫁に行った叔母が、音楽事業開始時まで事業に投資や便宜を図ってくれていた為、日本でよく勘違いされるように、まったくゼロから起業したわけではない。
+
+===音楽産業===
+その後、趣味で始めた中古[[レコード]]の通信販売で成功を収める。[[1970年]]にはレコードレーベル「[[ヴァージン・レコード]]」を立ち上げ、[[セックス・ピストルズ]]や[[カルチャー・クラブ]]、[[マイク・オールドフィールド]]などの人気[[ミュージシャン]]が所属するイギリスを代表するレコードレーベルの1つへと成長させた。
+
+後に「ヴァージン・レコード」を[[EMI]]に売却したが、「[[V2レコード]]」を新たに立ち上げ、[[ロンドン]]や[[東京]]を始めとする世界各国で音楽ショップ「[[ヴァージン・メガストア]]」を展開するなど、音楽産業は同グループの中核に位置づけられている。
+
+===航空産業===
+[[File:GVFAB.jpg|right|240px|thumb|ヴァージン・アトランティック航空のボーイング747-400]]
+[[1984年]]に[[ヴァージン・アトランティック航空]]を設立。[[ボーイング747]]-200のリース機を1機購入し、[[ロンドン]]([[ロンドン・ガトウィック空港|ガトウィック]])- [[ニューヨーク]]([[ニューアーク・リバティー国際空港|ニューアーク]])間に就航させる。その後次第に規模を拡大し、[[1988年]]には東京([[成田空港]])路線にも就航した。
+
+世界初の[[エコノミークラス]]へのシート内蔵[[テレビ]]の導入や機内でのマッサージサービス、完全に背もたれが倒れる[[ビジネスクラス]]の導入や超大型機[[エアバスA380]]の導入など、斬新なサービスを次々と導入する身軽さを売り物にし大成功を収め、現在は[[ボーイング747-400]]や[[エアバスA340]]などの最新鋭機材を数十機導入し、[[香港]]、[[シドニー]]、[[ロサンゼルス]]など世界中の主要都市に就航するまでに成長した。
+
+その後も[[ヨーロッパ]]圏内の[[格安航空会社]][[ヴァージン・エキスプレス]]や[[オーストラリア]]の格安[[航空会社]]である[[ヴァージン・ブルー]]、さらに[[ナイジェリア]]最大の航空会社であるヴァージン・ナイジェリアや[[アメリカ合衆国|アメリカ]]に格安航空会社のヴァージン・アメリカを設立する。また[[航空連合]]という形での航空業界再編には反対の立場を取る(ただし、個別に[[マイレージ]]提携している航空会社はいくつか存在し、[[スターアライアンス]]とは比較的近い関係にある)など、航空業界の風雲児として注目を集め続ける。
+
+===多業種への参入===
+[[File:Jenson Button 2009 China.jpg|240px|thumb|ブラウンGP]]
+音楽産業や航空産業での成功を元に、ヨーロッパ圏内の[[携帯電話]]事業への参入や、「[[ヴァージン・コーラ]]」などの飲料水事業、「ヴァージン・シネマズ」ブランドで全世界に展開する[[映画館]]やイギリス国内の[[鉄道]]の経営、金融事業などへ次々と参入した。
+
+中には失敗して早期に撤退するものもあったものの、いくつかの事業では業界の慣習を破った新機軸を打ち出すことにより一定の成功を収めており、現在グループ全体で22カ国、25,000人の従業員を擁する規模にまで成長した。
+
+[[2004年]]には「[[ヴァージン・ギャラクティック]]」を立ち上げ、[[宇宙旅行]]事業にも参入を開始した。[[2007年]]-[[2008年]]には経営危機に陥った「[[ノーザン・ロック]][[銀行]]」の買収に名乗りを上げて話題を呼んだ(最終的には国有化)。
+
+また、[[2005年]]に[[日本]]人ドライバーの[[佐藤琢磨]]のスポンサーとなったことを皮切りに、[[フォーミュラ1]]へのスポンサーを開始し、[[2009年]]には、イギリスに本拠を置く「[[ブラウンGP]]」へスポンサーとして参加した。[[2010年]]については、新規参戦予定の[[マノー・グランプリ]]へ出資し、チーム名を「[[ヴァージン・レーシング]]」と変更してF1への関わりを強化する。
+
+==冒険家==
+近年は飛行機による無着陸世界一周飛行や[[熱気球]]での太平洋や大西洋横断や世界一周飛行、民間[[宇宙旅行]]など、空の冒険へ積極的に参画し、特に[[1991年]]に行われた気球での太平洋横断チャレンジの際は、自らが搭乗者として乗り込むなど、他の大企業の経営者には決して見られないアグレッシブさを持つ。
+
+==ナイト==
+[[2000年]]には、事業の成功による雇用創出と外貨獲得によるイギリス経済への貢献により、[[エリザベス2世 (イギリス女王)|エリザベス2世]][[女王]]より「[[ナイト]]」の称号を賜わる。また、[[ダイアナ (プリンセス・オブ・ウェールズ)|ダイアナ妃]]など、[[イギリス王室]]との親交も多い。
+
+==映画==
+[[ファイル:ETalk2008-Sir Richard Branson.jpg|thumb|[[2008年]]の[[トロント国際映画祭]]にて]]
+ヴァージン・アトランティック航空が製作協力を行った[[映画]]「[[007 カジノ・ロワイヤル]]」の[[マイアミ国際空港]]のシーンに、同社の航空機とともに[[カメオ出演]]している。なお、ヴァージン・アトランティック航空の最大のライバルの[[ブリティッシュ・エアウェイズ]]の機内でこの作品が放映された際には、一瞬しか映っていないにもかかわらず、このシーンがカットされている。
+
+ロックバンド[[XTC (バンド)|XTC]]の"Generals and Majors"のビデオクリップに、リチャード・ブランソンに酷似した人物が軍人役で出演している。XTCは、かつて[[ヴァージン・グループ]]に属していた[[ヴァージン・レコード]]と契約していて、リチャード・ブランソンはXTCをとても気に入っていたと言われている。その話が本当だとすれば、カメオ出演したとしても不思議ではないのだが、真偽のほどは不明。[[YouTube]]にも「あれはリチャード・ブランソンではないのか?」と言った投稿が多い。
+
+==その他==
+[[カリブ海]]にあるイギリス領[[バージン諸島]]の無人島を30万ドルで購入した。無人島に水道、電気を引き、バリ風の建物を建設し、リゾート地として開拓している。現在は[[ネッカーアイランド]]と呼ばれ、リチャード・ブランソンは友人達を招待し、もてなしている。
+
+他にも[[Vオーストラリア]]の離陸前に流される機内ムービーでブランソン本人と思われるアニメキャラが乗客として登場している。
+
+==外部リンク==
+*[http://www.virginatlantic.co.jp/ ヴァージンアトランティック航空]
+*[http://www.virginmega.co.jp/ ヴァージンメガストア]
+
+{{DEFAULTSORT:ふらんそん りちやあと}}
+[[Category:イギリスの実業家]]
+[[Category:1950年生]]
+[[Category:存命人物]]
+[[Category:ヴァージン・グループ]]
+
+[[af:Richard Branson]]
+[[ar:ريتشارد برانسون]]
+[[bg:Ричард Брансън]]
+[[cs:Richard Branson]]
+[[cy:Richard Branson]]
+[[da:Richard Branson]]
+[[de:Richard Branson]]
+[[en:Richard Branson]]
+[[eo:Richard Branson]]
+[[es:Richard Branson]]
+[[et:Richard Branson]]
+[[fa:ریچارد برانسون]]
+[[fi:Richard Branson]]
+[[fr:Richard Branson]]
+[[gl:Richard Branson]]
+[[he:ריצ'רד ברנסון]]
+[[hr:Richard Branson]]
+[[id:Richard Branson]]
+[[it:Richard Branson]]
+[[ko:리처드 브랜슨]]
+[[lt:Richard Branson]]
+[[nl:Richard Branson]]
+[[no:Richard Branson]]
+[[pl:Richard Branson]]
+[[pt:Richard Branson]]
+[[ru:Брэнсон, Ричард]]
+[[simple:Richard Branson]]
+[[sk:Richard Branson]]
+[[sv:Richard Branson]]
+[[ta:றிச்சர்ட் பிரான்சன்]]
+[[th:ริชาร์ด แบรนสัน]]
+[[tr:Richard Branson]]
+[[uk:Річард Бренсон]]
+[[zh:理查德·布蘭森]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/ヴァージン・ギャラクティック.xml b/WptscsTest/Data/MediaWiki/ja/ヴァージン・ギャラクティック.xml
new file mode 100644 (file)
index 0000000..55710ed
--- /dev/null
@@ -0,0 +1,121 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>ヴァージン・ギャラクティック</title>\r
+    <id>931557</id>\r
+    <revision>\r
+      <id>31223868</id>\r
+      <timestamp>2010-03-26T12:34:48Z</timestamp>\r
+      <contributor>\r
+        <username>Y-kw</username>\r
+        <id>388592</id>\r
+      </contributor>\r
+      <comment>+[[Category:宇宙旅行]]</comment>\r
+      <text xml:space="preserve">{{基礎情報 会社
+|社名=ヴァージン・ギャラクティック
+|英文社名=Virgin Galactic
+|ロゴ=
+|種類={{interlang|en|private company}}
+|市場情報=
+|略称=
+|国籍={{USA}}
+|郵便番号=
+|本社所在地=[[ニューメキシコ州]]
+|電話番号=
+|設立=[[2004年]]
+|業種=サービス業
+|統一金融機関コード=
+|SWIFTコード=
+|事業内容=[[宇宙旅行]]
+|代表者=ウィル・ホワイトホーン社長
+|資本金=
+|発行済株式総数=
+|売上高=
+|営業利益=
+|純利益=
+|純資産=
+|総資産=
+|従業員数=30人
+|決算期=
+|主要株主=[[ヴァージン・グループ]]
+|主要子会社=
+|関係する人物=
+|外部リンク=http://www.virgingalactic.com/
+|特記事項=
+}}
+[[Image:Spaceship One in flight 1.jpg|thumb|250px|スペースシップ・ワンの飛行]]
+'''ヴァージン・ギャラクティック '''({{lang|en|Virgin Galactic}})は、[[ヴァージン・グループ]]会長の[[リチャード・ブランソン]]が設立した[[宇宙旅行]]ビジネスを行う会社である。社長はウィル・ホワイトホーン。
+
+==事業==
+[[スペースシップワン]]の弾道飛行により[[Ansari X Prize]]に勝利し賞金1000万ドルを獲得した[[スケールド・コンポジッツ]]社より技術提供を受け、現在[[スペースシップツー]]級の一番機[[VSSエンタープライズ]]を開発しており、アメリカの[[ニューメキシコ州]]に「スペースポート・アメリカ」、[[スウェーデン]]の北部に「スペースポート・スウェーデン」を建設している。
+
+現在宇宙旅行者を募集中であり、世界で最初の宇宙旅行者100人はファウンダーと呼ばれている。そのうち[[日本人]]は[[平松庚三]]を含む3名が選ばれている。
+
+==計画==
+ヴァージン・ギャラクティック社は年500人の観光客を一人当たり20万ドルの料金で宇宙へ送る計画を立てている。飛行は[[弾道飛行]]で、[[大気圏]]と[[宇宙]]のおおよその境界とされる地上100kmを若干超える高さまで到達することになっている。完全な無重力になる時間はおよそ6分間を予定している。将来的には軌道上を周回する宇宙機の投入も計画している。
+
+1960年代から2007年まで、100km以上の高さの宇宙に到達した飛行士は448人しかいない(そのほとんどは地球を周回している)。ヴァージン・ギャラクティックは毎年これを超える人数の観光客を宇宙空間に送り込むことになる。
+
+== 外部リンク ==
+* [http://www.virgingalactic.com/ Virgin Galactic(英語版)]
+* [http://www.sorae.jp/030703/ ヴァージン・ギャラクティック | sorae.jp]
+
+{{DEFAULTSORT:うあしんきやらくていつく}}
+[[Category:ニューメキシコ州の企業]]
+[[Category:ヴァージン・グループ|きやらくていつく]]
+[[Category:航空宇宙企業]]
+[[Category:旅行会社]]
+[[Category:宇宙旅行]]
+
+{{space-stub}}
+
+[[ar:فيرجن غالاكتيك]]
+[[cs:Virgin Galactic]]
+[[de:Virgin Galactic]]
+[[en:Virgin Galactic]]
+[[es:Virgin Galactic]]
+[[fi:Virgin Galactic]]
+[[fr:Virgin Galactic]]
+[[he:וירג'ין גלקטיק]]
+[[it:Virgin Galactic]]
+[[lt:Virgin Galactic]]
+[[nl:Virgin Galactic]]
+[[pt:Virgin Galactic]]
+[[ru:Virgin Galactic]]
+[[sk:Virgin Galactic]]
+[[sv:Virgin Galactic]]
+[[tr:Virgin Galactic]]
+[[wuu:银河处女]]
+[[zh:維珍銀河]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/ヴァージン・グループ.xml b/WptscsTest/Data/MediaWiki/ja/ヴァージン・グループ.xml
new file mode 100644 (file)
index 0000000..397bc18
--- /dev/null
@@ -0,0 +1,142 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>ヴァージン・グループ</title>\r
+    <id>170568</id>\r
+    <revision>\r
+      <id>32764347</id>\r
+      <timestamp>2010-06-26T01:37:36Z</timestamp>\r
+      <contributor>\r
+        <username>LucienBOT</username>\r
+        <id>290117</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[es:Virgin Group]]</comment>\r
+      <text xml:space="preserve">{{基礎情報 会社
+|社名=ヴァージン・グループ
+|英文社名=Virgin Group
+|ロゴ=
+|種類={{lang|en|Private ({{interlang|en|Private company limited by shares|Limited liability}})}}
+|市場情報=
+|略称=
+|国籍={{GBR}}
+|郵便番号=
+|本社所在地=[[ロンドン]] [[ハマースミス・アンド・フラム]]&lt;br/&gt;{{lang|en|The School House, 50 Brook Green}}
+|電話番号=
+|設立=[[1970年]]
+|業種=
+|統一金融機関コード=
+|SWIFTコード=
+|事業内容=
+|代表者=[[リチャード・ブランソン]]会長
+|資本金=
+|発行済株式総数=
+|売上高=
+|営業利益=
+|純利益=
+|純資産=
+|総資産=
+|従業員数=
+|決算期=
+|主要株主=
+|主要子会社=
+|関係する人物=
+|外部リンク=http://www.virgin.com/
+|特記事項=
+}}
+'''ヴァージン・グループ'''({{lang|en|Virgin Group}})は、[[イギリス]]の[[多国籍企業]]である。
+
+会長の[[リチャード・ブランソン]]が興した古レコードの通信販売会社が始まりである。低価格と高サービスを売り物に[[音楽]]、[[映画館]]、[[航空]]旅行、[[鉄道]]、[[金融]]など多くの分野に進出している。株式未公開企業であるため経営実態は不明である。欧米企業のビジネスモデルは、単一の事業に特化して専門性に徹する手法が多いが、ヴァージンでは日本型の財閥・系列モデルを標榜する点が特筆される。
+
+== グループ会社 ==
+=== メディア ===
+* ヴァージン・メディア - ケーブルテレビ運営
+* ヴァージン出版 - 出版社
+* ヴァージン.net - インターネット・プロバイダー
+* [[V2レコード]]
+* [[ヴァージン・メガストアーズ|ヴァージン・メガストア]] - 音楽・映像ソフト販売
+*:(日本には[[丸井]]との合弁で進出。2005年3月に[[カルチュア・コンビニエンス・クラブ]]が買収、現在は全店がTSUTAYAなどに転換された)
+
+=== 旅行とツーリズム ===
+* [[ヴァージン・アトランティック航空]] - 国際線航空会社
+* [[ヴァージン・アメリカ]] - 2005年に運航開始のアメリカ国内線格安航空会社
+* [[ヴァージン・ナイジェリア航空]] - ヴァージン・アトランティック航空とナイジェリア政府の合弁で2004年に設立
+* [[ヴァージン・エキスプレス]] - ヨーロッパの格安航空会社 → SNブリュッセル航空と合併し、[[ブリュッセル航空]]となる
+* [[ヴァージン・ブルー]] (少数株主) - オーストラリアの低価格航空会社
+* [[V オーストラリア]] オーストラリアの国際線専用航空会社
+* ヴァージン・ホリデーズ - 旅行会社
+* ヴァージン・リムジンズ
+* [[ヴァージン・トレインズ]] - 鉄道会社
+* [[ヴァージン・ギャラクティック]] - [[宇宙旅行]]会社
+
+=== 他 ===
+*[[ヴァージン・レーシング]] - 2010年から[[フォーミュラ1]]に参戦を開始。
+*[[ヴァージン・コーラ]]
+*ヴァージン・モバイル
+*[[ヴァージン・ユナイト|ヴァージン財団]]
+
+=== かつてのグループ会社 ===
+* [[ヴァージン・レコード]]([[1992年]]に[[EMI]]グループへ売却)
+* [[ヴァージンシネマズ]]([[2003年]]に[[東宝]]グループへ売却)現:[[TOHOシネマズ]]
+
+== 関連 ==
+*[[民間宇宙飛行]]-[[スペースシップワン]]
+*[[マイク・オールドフィールド]]『[[チューブラーベルズ]]』([[1973年]]):ヴァージン・グループ発展に多大な貢献をした[[プログレッシブ・ロック]]のアルバム。表題の楽曲の冒頭部分が映画「[[エクソシスト (映画)|エクソシスト]]」に用いられた。[[ヴァージン・レコード]]が最初にリリース契約した作品である。
+
+== 外部リンク ==
+* [http://www.virgin.com/ Virgin Group Portal(英語版)]
+* [http://www.virginbrand.com/ virginbrand.com/ an unofficial virgin blog(英語)]
+
+{{DEFAULTSORT:うあしんくるふ}}
+[[Category:ヴァージン・グループ|*]]
+[[Category:ロンドンの企業]]
+[[Category:多国籍企業]]
+
+[[bg:Върджин Груп]]
+[[de:Virgin Group]]
+[[en:Virgin Group]]
+[[es:Virgin Group]]
+[[fa:گروه ویرجین]]
+[[fi:Virgin Group]]
+[[fr:Virgin Group]]
+[[he:וירג'ין]]
+[[it:Virgin Group]]
+[[nl:Virgin Group]]
+[[pl:Virgin Group]]
+[[pt:Virgin Group]]
+[[ru:Virgin Group]]
+[[simple:Virgin Group]]
+[[sv:Virgin Group]]
+[[zh:維珍集團]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/宇宙旅行.xml b/WptscsTest/Data/MediaWiki/ja/宇宙旅行.xml
new file mode 100644 (file)
index 0000000..f7053b4
--- /dev/null
@@ -0,0 +1,171 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>宇宙旅行</title>\r
+    <id>93913</id>\r
+    <revision>\r
+      <id>32592575</id>\r
+      <timestamp>2010-06-14T14:41:35Z</timestamp>\r
+      <contributor>\r
+        <username>Nekosuki600</username>\r
+        <id>21263</id>\r
+      </contributor>\r
+      <comment>/* 民間宇宙船の開発状況 */</comment>\r
+      <text xml:space="preserve">{{出典の明記|date=2009年10月}}
+'''宇宙旅行'''(うちゅうりょこう、{{Lang-en|Space tourism}})とは、国家政策や科学的研究を目的とした[[宇宙開発]]と対比して、専ら個人的な興味関心のもとに[[宇宙空間]]に赴く行為を指す。[[2008年]]1月時点では[[宇宙飛行士]]になるためには高度な知識や様々なミッションをフライト中にこなし続ける技能と経験、宇宙飛行に付随する様々な訓練を要する。しかし、多くの民間企業が特別な訓練などを必要とせず、現在で言うところの[[海外旅行]]程度の手続き的・身体的負担で短時間、宇宙空間に滞在し帰還することをまずは目指し、技術開発にしのぎを削っている。
+
+== 日本人初の民間宇宙旅行人 ==
+[[1990年]][[12月2日]]に[[ソビエト連邦]]の[[ソユーズ]]TM-11に搭乗、宇宙ステーション[[ミール]]に9日間滞在した[[秋山豊寛]]は、世界で初めて宇宙空間に到達した[[ジャーナリスト]]であり、日本人初の宇宙旅行を体験した人物である。[[TBSテレビ|TBS]]が宇宙特派員として派遣した彼は、長期間にわたる訓練の後に宇宙へと旅立った。
+
+予定では、日本人初の宇宙飛行として[[宇宙開発事業団]]に所属する[[毛利衛]]が秋山より先に宇宙へと旅立つ事となっていた。しかし、[[チャレンジャー (オービタ)|チャレンジャー号]]事故の影響で毛利のフライトが延期され、結果として日本人初の宇宙飛行参加者は民間人である秋山となった。純粋な科学者ではない教育関係者なども[[スペースシャトル]]などに搭乗しており、秋山は一応睡眠実験などの科学実験に参加しているので厳密な定義は出来ないが、彼が民間企業のスポンサーによって宇宙飛行を果たした人間の1人であることは間違いない。
+
+== 「宇宙旅行」第1号 ==
+民間人が全額自己負担で宇宙旅行に旅立った世界初の例は、[[スペースアドベンチャーズ]]社が[[ロシア]]宇宙局と契約を仲介することで実現したアメリカの大富豪[[デニス・チトー]]によるものである。彼は[[国際宇宙ステーション]](ISS)に人員と物資を補給する[[ソユーズ]]の定期便でロシアから旅立ち、[[2001年]][[4月28日]]から[[5月6日]]までISSに滞在した。それに続き、[[2002年]]には[[南アフリカ共和国]]の実業家[[マーク・シャトルワース]]が宇宙旅行を実現している。[[コロンビア (オービタ)|コロンビア号]]の事故からも分かるように2000年代においても宇宙開発には危険が伴い、気軽に民間人が宇宙旅行をする時代が来ているとは言い難い。ロシアは国家経済の事情で民間企業にソユーズの座席を売ることで打ち上げ資金を確保している状況であり、「宇宙旅行」に消極的な[[アメリカ航空宇宙局]]も、コロンビア号の事故以来ソユーズにISSの維持に必要な物資の輸送を頼っていることから、こうした宇宙開発の冷え込みが皮肉なことに宇宙旅行を実現させている側面もある。
+
+== 宇宙旅行者一覧 ==
+{| class="wikitable"
+|+
+! 順位
+! 人物
+! 打ち上げ日
+! 備考
+!  便名
+! ロケット
+|-
+| 1 
+| [[デニス・チトー]]
+| [[2001年]][[4月28日]]
+| 初の宇宙旅行者
+| [[ソユーズTM-32|TM-32]] / [[ソユーズTM-31|TM-31]]
+| rowspan="8" |[[ソユーズ]]
+|-
+| 2
+| [[マーク・シャトルワース]]
+| [[2002年]][[4月25日]]
+| 
+| [[ソユーズTM-34|TM-34]] / [[ソユーズTM-33|TM-33]]
+|-
+| 3
+| [[グレゴリー・オルセン]]
+| [[2005年]][[10月1日]]
+| 
+| [[ソユーズTMA-7|TMA-7]] / [[ソユーズTMA-6|TMA-6]]
+|-
+| 4
+| [[アニューシャ・アンサリ]]
+| [[2006年]][[9月18日]]
+| 初の女性旅行者
+| [[ソユーズTMA-9|TMA-9]] / [[ソユーズTMA-8|TMA-8]]
+|-
+| 5
+| [[チャールズ・シモニー]]
+| [[2007年]][[4月7日]]
+| 
+| [[ソユーズTMA-10|TMA-10]] / [[ソユーズTMA-9|TMA-9]]
+|-
+| 6
+| [[リチャード・ギャリオット]]
+| [[2008年]][[10月14日]]
+| 
+| [[ソユーズTMA-13|TMA-13]] / [[ソユーズTMA-12|TMA-12]]
+|-
+| 7
+| チャールズ・シモニー
+| [[2009年]][[3月26日]]
+| 2回目の宇宙旅行
+| [[ソユーズTMA-14|TMA-14]] / [[ソユーズTMA-13|TMA-13]]
+|-
+| 8
+| [[ギー・ラリベルテ]]
+| [[2009年]][[9月30日]]
+| 
+| [[ソユーズTMA-16|TMA-16]] / [[ソユーズTMA-15|TMA-15]]
+|-
+|}
+※ISSに滞在した者のみ、[[弾道飛行]]による数十分の旅行は含めない
+
+== 民間宇宙船の開発状況 ==
+{{Main|民間宇宙飛行}}
+[[アメリカ合衆国|米国]]の旅行会社「ジグラム社」は、ジェット機の背に搭載されたロケットプレーンを高度16kmで切り離し、そこからはロケットエンジンで高度100kmまで上昇し、地球を見ながら弾道飛行による2分半の無重力状態を体験できるという宇宙旅行を企画した。[[1998年]]、[[ペプシコーラ]]を日本で販売する[[サントリー]]は、懸賞でこのロケットプレーン搭乗券をプレゼントするというキャンペーンを行った。当初は[[2000年]]に実現予定であったが、ロケットプレーンの開発の遅れなどから、未だ実現していない。
+
+X-prizeは民間による宇宙船開発に対する賞金制度であり、[[1996年]]に発足した(2004年、[[Ansari X Prize]]に名称変更)。 3人以上の乗員(乗員1名と、2名の乗員に相当する重量の[[バラスト]]でも可)を高度100km以上の弾道軌道に打ち上げ、さらに、2週間以内に所定の再使用率を達成し、同じ機体で再度打ち上げを達成した非政府団体に賞金1000万ドルが送られるというものである。地球一周旅行をはじめ、多くの長距離旅行の壁は資本家による賞金制度をきっかけに実現されてきたが、X-prizeは資金面のみならず、法律面でも発射試験までには煩雑な点が多く、脱落者が続出した。その中でスケールド・コンポジッツ社の有人宇宙船「[[スペースシップワン]]」は[[2004年]][[6月21日]]に高度100キロの試験飛行に成功し、続けて賞金獲得のための本飛行も[[2004年]][[9月29日]]と[[2004年]][[10月4日]]に2度目の飛行を行った。9月29日のフライトにおいては一時機体が不安定になるなどのトラブルがあったものの、いずれも乗員1名とバラストを載せた飛行を達成し、同社は賞金を獲得した。
+
+[[2005年]]、[[ライブドア]]の[[堀江貴文]]が同基金の理事に就任した。同年10月、堀江貴文は個人プロジェクトとして「ジャパン・スペース・ドリーム」を立ち上げることを発表した。このプロジェクトはロシアの宇宙機関NPO Mashinostroyeniaが所有するカプセル型宇宙船「Almaz Capsule」を使用し、事業の運営は米国のExcalibur Almazが行なう。
+
+[[ヴァージングループ]]に設立された宇宙旅行会社「[[ヴァージン・ギャラクティック]]」(Virgin Galactic)はスペースシップワンからの技術供与を受け、宇宙旅行ビジネスを開始することを発表、同飛行のスポンサーとなった。2009年からのサービス開始を目指しており、[[スペースシップツー]]による宇宙旅行ビジネスの実現を目指す。最初の宇宙旅行者として100人が世界中から選ばれ、ファウンダーと呼ばれている。日本人では稲波紀明が世界最年少のファウンダーに選ばれている。
+
+== SFに描かれた宇宙旅行 ==
+初めて宇宙旅行を描いた[[サイエンス・フィクション|SF]]小説は[[1865年]]の[[ジュール・ヴェルヌ]]による『[[月世界旅行]]』である。この作品と[[ハーバート・ジョージ・ウェルズ]]の『[[月世界最初の人間]]』([[1901年]])から着想され、[[1902年]]に発表された[[ジョルジュ・メリエス]]による[[映画]]も有名である。ヴェルヌの小説の原題は『地球から月へ(De la Terre a la Lune)』、メリエスの映画の原題は『月世界旅行(Le Voyage dans la Lune)』だが、日本では双方とも『月世界旅行』となっている。また、ヴェルヌの小説には、後編にあたる『[[月世界探検]]』(原題『月めぐり(Autour de la Lune)』([[1869年]])がある。ヴェルヌは270mの巨大な[[大砲]]を用いて宇宙空間に到達する方法を比較的に科学的説得力のある内容で描いており、赤道付近に発射場を設置することなど、一世紀以上先に実現されることになる宇宙開発の基礎をいくつかの点で言い当てている。
+
+[[アーサー・C・クラーク]]原作の映画『[[2001年宇宙の旅]]』でも、[[地球]]から[[月]]に向かう宇宙旅行が描かれている。ロケットプレーン(パン・アメリカン航空のオリオン号)で地球軌道上の[[宇宙ステーション]]にランデブーした後、月着陸船に乗換え、月に向かうというものだが、[[宇宙食|宇宙での機内食]]、客室添乗員の履くグリップシューズ、宇宙トイレなど、綿密な科学考証のもと、宇宙旅行の様子が詳細に描かれている。
+
+一方、宇宙旅行をより簡便な物にする手段として、[[静止衛星]]と地上とをケーブルで結ぶ[[軌道エレベータ]]が考案され、クラークの『[[楽園の泉]]』はじめ多くのSF作品で採り上げられた。現在は実現に向けた動きも見られる様になっている。
+
+== 関連項目 ==
+* [[ヴァージン・ギャラクティック]]
+* [[宇宙飛行関係者]]
+* [[ロケット・ミサイル技術の年表]]
+* [[宇宙開発]]
+* [[宇宙開発競争]]
+* [[コンスタンチン・E・ツィオルコフスキー]] - 「宇宙旅行の父」と呼ばれるロシアのロケット研究者
+* [[スペースシップワン|スペース・シップ・ワン]]
+* [[ロケットプレーンXP]]
+
+[[Category:宇宙旅行|*]]
+
+[[ca:Turisme espacial]]
+[[cs:Vesmírný turista]]
+[[da:Rumturisme]]
+[[de:Weltraumtourismus]]
+[[en:Space tourism]]
+[[eo:Kosmoturismo]]
+[[es:Turismo espacial]]
+[[eu:Espazio-turismo]]
+[[fa:گردشگری فضایی]]
+[[fi:Avaruusturisti]]
+[[fr:Tourisme spatial]]
+[[he:תיירות בחלל]]
+[[hi:अंतरिक्ष पर्यटन]]
+[[hu:Űrturizmus]]
+[[it:Turismo spaziale]]
+[[li:Ruimtetoerisme]]
+[[nl:Ruimtetoerisme]]
+[[pl:Turysta kosmiczny]]
+[[pt:Turismo espacial]]
+[[ru:Космический туризм]]
+[[sv:Rymdturism]]
+[[ta:விண்வெளிச் சுற்றுலா]]
+[[tr:Uzay turizmi]]
+[[zh:太空游客]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/弾道飛行.xml b/WptscsTest/Data/MediaWiki/ja/弾道飛行.xml
new file mode 100644 (file)
index 0000000..9ecffd1
--- /dev/null
@@ -0,0 +1,72 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>弾道飛行</title>\r
+    <id>556978</id>\r
+    <revision>\r
+      <id>32592651</id>\r
+      <timestamp>2010-06-14T14:45:19Z</timestamp>\r
+      <contributor>\r
+        <username>Nekosuki600</username>\r
+        <id>21263</id>\r
+      </contributor>\r
+      <text xml:space="preserve">'''弾道飛行'''(だんどうひこう、{{lang-en-short|sub-orbital flight}})は、[[大砲]]の[[砲弾|弾]]のように[[円 (数学)|弧]]の[[弾道]]を描く飛行形態。一般的には、[[弾道ミサイル]]や[[軌道 (力学)|軌道]]に到達しない[[ロケット]]の飛行経路を指す言葉として使われる。[[宇宙開発]]の分野では'''宇宙弾道飛行'''や'''準軌道飛行'''と呼ばれることもある(英:Sub-orbital spaceflight)。
+
+[[大陸間弾道ミサイル|ICBM]]などの弾道ミサイルの中には、高度1000kmという[[スペースシャトル]]の飛行高度(~578km)以上の高さに達するものもあるが、弾道飛行では速度が[[宇宙速度#第一宇宙速度|第一宇宙速度]]を超えないため、いずれは地表に到達し、[[地球]]を回る軌道となることはない。
+
+[[宇宙飛行]]という観点から見ると、弾道飛行は宇宙空間に到達でき、かつ必要な速度は抑えられるため、最初の目標とされてきた。[[1961年]]、[[アメリカ合衆国|アメリカ]]初の[[有人宇宙飛行]]を実現した[[マーキュリー計画]]も、当初は16分間の弾道飛行であった。また、[[2004年]]に民間企業による[[宇宙船]]として初めて有人宇宙飛行を実現した[[スペースシップワン]]も、高度100km、[[マッハ数|マッハ]]3の弾道飛行であった。[[2006年]]現在では、弾道飛行は[[宇宙旅行]]の対象となっている。
+
+==関連項目==
+*[[人工衛星の軌道]]
+*[[宇宙速度]]
+
+==外部リンク==
+*[http://www.spaceadventures.jp/web/subo.html スペースアドベンチャーズ 宇宙への旅 - 宇宙弾道飛行]
+
+{{aviation-stub|たんとうひこう}}
+
+[[Category:ロケット|たんとうひこう]]
+[[Category:弾道ミサイル|たんとうひこう]]
+
+[[cs:Suborbitální kosmický let]]
+[[de:Suborbitaler Flug]]
+[[en:Sub-orbital spaceflight]]
+[[es:Vuelo suborbital]]
+[[fr:Vol suborbital]]
+[[it:Volo suborbitale]]
+[[nl:Suborbitale ruimtevlucht]]
+[[pl:Lot suborbitalny]]
+[[ru:Суборбитальный космический полёт]]
+[[sk:Suborbitálny kozmický let]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/民間宇宙飛行.xml b/WptscsTest/Data/MediaWiki/ja/民間宇宙飛行.xml
new file mode 100644 (file)
index 0000000..b56b182
--- /dev/null
@@ -0,0 +1,235 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>民間宇宙飛行</title>\r
+    <id>1678386</id>\r
+    <revision>\r
+      <id>33793936</id>\r
+      <timestamp>2010-09-01T16:00:56Z</timestamp>\r
+      <contributor>\r
+        <username>Hideki2009</username>\r
+        <id>321879</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ひらがな→カタカナ</comment>\r
+      <text xml:space="preserve">[[ファイル:Satellites_For_Sale_-_GPN-2000-001036.jpg|right|thumb|250px|『For Sale』のサインを持つ[[アメリカ航空宇宙局|NASA]]の[[宇宙飛行士]]]]
+'''民間宇宙飛行'''(みんかんうちゅうひこう、{{Lang-en|Private spaceflight}})とは、政府などの公的機関の宇宙計画ではない手段によって地上{{km to mi|100|abbr=no|wiki=yes}}、[[カーマン・ライン]]より上方に到達し、[[宇宙飛行士]]の資格を得る[[宇宙飛行]]を指す。
+
+== 概要 ==
+[[宇宙時代]]の最初の数十年間で、[[アメリカ合衆国]]の[[アメリカ航空宇宙局|NASA]]と[[ソビエト連邦]][[設計局]]は系列政府機関と[[資本主義|私企業]]との[[共同開発]]による[[宇宙技術]]を開拓した。この後、防衛産業の大企業は、政府のロケットや[[人工衛星|商業衛星]]打ち上げ技術から得られた[[射場|発射設備]]を開発し、操業を始めた。地球軌道での民間宇宙飛行は[[通信衛星]]、[[衛星放送|衛星テレビ]]、[[衛星ラジオ]]、及び軌道の[[宇宙旅行]]を含んでいる。
+{{Main|宇宙開発競争|宇宙開発競争の年表|宇宙旅行}}
+
+最近では民間企業開発の[[スペースプレーン]]が開発され、試験飛行が始まっている。民間宇宙飛行は地球周回軌道を超えるものも計画されており、[[スペースコロニー]]、[[太陽帆]]、[[宇宙葬]]、及び民間の宇宙飛行を含んでいる。民間での宇宙飛行のプロトタイプとしては地球の低軌道を[[弾道飛行]]する民間宇宙旅行が既に存在している&lt;ref&gt;{{Cite web|url=http://www.bigelowaerospace.com/news/?Special_Announcement|title=Special Announcement|publisher=[[:en:Bigelow Aerospace]]|date=2008年4月1日|accessdate=2008年7月10日}}&lt;/ref&gt;。
+
+== 商業打ち上げの歴史 ==
+{{Main|使い捨て型ロケット}}
+
+宇宙飛行の初期、[[国民国家|大きな国家]]には[[宇宙船]]を開発して打ち上げるだけの[[資源]]があった。[[アメリカ航空宇宙局|アメリカの宇宙計画]]と[[ソ連の宇宙計画]]の両方が、宇宙飛行士として主に[[軍人]][[操縦士#航空機などのパイロット|パイロット]]を使用し宇宙船の操作を行わせた。この間は民間人宇宙飛行士が存在出来る余地はなかった。その間、どんな民間企業も打ち上げ施設を利用出来なかった。その後、民間企業は宇宙発射施設の資源を提供・購入し、その結果、民間宇宙飛行の開発を始める土壌が出来上がった。
+
+民間宇宙飛行の初期段階は[[放送衛星|商業通信衛星]]の打ち上げだった。[[1962年]]に[[ジョン・F・ケネディ]]が制定した[[1962年度放送衛星条約]]は民間企業自身が通信衛星を所有・操作しながら衛星通信事業への道を切り開いた。これらは国家単位で所有されている打ち上げシステムで打ち上げられた。
+
+=== ヨーロッパのスポンサー ===
+{{Main|アリアンスペース}}
+
+[[1980年]][[3月26日]]、[[欧州宇宙機関]] (ESA) によってアリアンスペースが設立された。この企業はESAで開発・実用化された人工衛星打ち上げ用ロケットである[[アリアン|アリアンロケット]]の打ち上げ実施のために[[ヨーロッパ]]12ヶ国53社が出資した共同企業である。
+
+アリアンスペースの通算としては260・261回目、アリアン5としては通算40回目である&lt;ref&gt;{{Cite web|url=http://www.sorae.jp/030806/2473.html|title=アリアン5、40回目の打ち上げ|publisher=[http://www.sorae.jp sorae.jp]|date=2008年7月7日|accessdate=2008年7月13日}}&lt;/ref&gt;。
+
+=== アメリカの規制緩和 ===
+アメリカ、NASAの宇宙計画は[[1981年]][[4月12日]]の[[STS-1]]、[[コロンビア (オービタ)|コロンビア号]]の打ち上げから一貫して[[スペースシャトル]]が使用され続けたが、[[1986年]][[1月28日]]、[[STS-51-L]]で[[チャレンジャー号爆発事故]]が発生し、計画は変更された&lt;ref&gt;{{PDFlink|[http://www.cbo.gov/ftpdocs/59xx/doc5935/doc24c-Entire.pdf Setting Space Transportation Policy for the 1990s]|6,446 [[キビバイト|KiB]]}} cbo.gov、2008年2月14日、2008年7月14日閲覧。&lt;/ref&gt;。当初は、NASAは衛星打ち上げに助成金を支給し、スペースシャトルの長期運用による[[限界費用]]を引き延ばそうとした。
+
+[[1984年]][[10月30日]]、アメリカ[[大統領]][[ロナルド・レーガン]]は[[放送衛星|商業通信衛星]]の打ち上げに関する条例 (Commercial Space Launch Act) に署名した&lt;ref&gt;{{Cite web|url=http://www.reagan.utexas.edu/archives/speeches/1984/103084i.htm|title=Statement on Signing the Commercial Space Launch Act - October 30、1984|publisher=[http://www.reagan.utexas.edu www.reagan.utexas.edu]|accessdate=2008年7月14日}}&lt;/ref&gt;。これによってアメリカ企業は[[使い捨てロケット]]打ち上げ産業へ参入することが可能となった。
+
+この調印の前に、アメリカ国内での全ての商業通信衛星の打ち上げはNASAのスペースシャトルを使用することに制限された。
+
+[[1990年]][[11月5日]]には[[ジョージ・H・W・ブッシュ]]大統領が打ち上げシステム購買条例に署名した。この条例は以前のNASAのスペースシャトルによる衛星の打ち上げ事業独占を完全に反故にするもので、NASAの打ち上げ設備を民間企業が必要とするときにはいつでもそのサービスを利用出来るものとし、商業用途で最も大きな積載能力を欲するときにもそれを商業利用出来るものとした。
+
+[[1997年]]における民間商業用ロケット発射回数は政府所有の[[アメリカ東部地域実験場]]発射回数に数で勝った。
+
+=== ロシアの民営化 ===
+[[ロシア]]政府は1994年に[[S.P.コリョロフ ロケット&amp;スペース コーポレーション エネルギア|RSCエネルギア社]](RKKエネルギア)の株式の一部を個人[[投資家]]に販売した。エネルギアは[[フルニチェフ国立宇宙研究センター]]と共にロシアの有人宇宙探査計画の大部分を構成しており、1997年にはロシア政府は保有株式の殆どを安く売り払った。2002年現在のRSCエネルギア社の株式保有率は、エネルギア社が60 %を保有、残りの40 %を投資家が保有している&lt;ref&gt;{{Cite web|url=http://iss.jaxa.jp/mir/042800.html|title=ミール情報 2000年 4月28日の状況|publisher=[[宇宙航空研究開発機構|JAXA]]|date=2000年4月28日|accessdate=2008年7月14日}}&lt;/ref&gt;。
+
+=== 打ち上げ共同事業 ===
+1995年以来、[[ソユーズ|ソユーズロケット]]は[[スターセム]]を通して売り出されているが、フルニチェフ国立宇宙研究センターの[[プロトン (ロケット)|プロトンロケット]]は[[国際打ち上げサービス]](International Launch Services、ILS)を通して売り出される。エネルギアは、ソユーズロケットを組み立てて[[ウクライナ]]の海上で[[ゼニット (ロケット)|ゼニットロケット]]で打ち上げる[[シーローンチ]]プロジェクトの一部を所有している&lt;ref&gt;{{Cite web|url=http://www.aerospace-technology.com/projects/sealaunch/|title=Sea Launch System - Commercial heavy-lift launch services、USA|publisher=[http://www.aerospace-technology.com/ Aerospace Technology]|accessdate=2008年7月22日}}&lt;/ref&gt;。
+
+2003年、アリアンスペースは[[ボーイング]]、[[三菱重工業]]と共同で[[ローンチ・サービス・アライアンス|ローンチ・サービス・アライアンス社]]を設立した。2005年には、アメリカ国内の[[:en:Evolved Expendable Launch Vehicle|EELV]]を求める合衆国政府の小さな商業市場の独占のために[[ユナイテッド・ローンチ・アライアンス|ユナイテッド・ローンチ・アライアンス社]]と呼ばれる合併事業のために[[ロッキード・マーティン]]およびボーイングと提携した&lt;ref&gt;{{cite web|title=Boeing、Lockheed Martin to Form Launch Services Joint Venture|url=http://www.spaceref.com/news/viewpr.html?pid=16790|publisher=spaceref.com|accessdate=2008年2月13日}}&lt;/ref&gt;。
+
+今日では、多くの商用ロケット打ち上げ企業が世界中の通信衛星企業と政府宇宙機関に対するサービスを提供している。2005年には18の総合商業事業の打ち上げと37の非営利的な打ち上げがあった&lt;ref name="2005YIR"&gt;{{cite web|title=Commercial Space Transportation: 2005 Year In Review|url=http://www.faa.gov/about/office_org/headquarters_offices/ast/media/2005_YIR_FAA_AST_0206.pdf|publisher=faa.gov|accessdate=2008年2月13日}}[[Portable Document Format|PDF]]文書。&lt;/ref&gt;。このうちヨーロッパでの打ち上げは28 %、ロシアは44 %の商業衛星打ち上げを行ったが、アメリカは6 %に留まった&lt;ref name="2005YIR" /&gt;。
+
+== 民間宇宙飛行会社 ==
+{{Main|民間宇宙企業の一覧}}
+
+=== 宇宙までの輸送業務 ===
+{{Main|:en:Space transport}}
+
+宇宙への輸送業務は主に国家目的のものと民間商業目的のものとに分けられる。現在、全世界で一年間に80回の衛星打ち上げが行われている。このうち政府による衛星打ち上げが8割で、民間での商業衛星打ち上げは2割の約16機でしかない&lt;ref&gt;[http://www.pjnews.net/news/386/10696|太陽光発電所を宇宙に! 〜世界のトップを走る日本の宇宙発電計画〜]&lt;/ref&gt;。この分野はユナイテッド・ローンチ・アライアンス社が行うアメリカ合衆国政府が要するペイロードのための打ち上げ業務やアリアン・スペース社によるヨーロッパの衛星打ち上げによって寡占されている&lt;ref&gt;[[:en:Andy Pasztor]]、''Changing Trajectory: French Firms Vaults Ahead in Civilian Rocket Market''、The Wall Street Journal、A1、2007年1月25日、[[:en:Dow Jones &amp; Company]]&lt;/ref&gt;。ロシアの打ち上げサービスはこれらの企業に続いている。詳しくは[[ロケット一覧#打ち上げシステム]]を参照のこと。
+
+=== 商業軌道輸送サービス ===
+{{Main|商業軌道輸送サービス}}
+
+2006年1月18日、NASAは商業企業が軌道への輸送サービスを行うデモンストレーションを発表した&lt;ref&gt;{{cite web|title=NASA Seeks Proposals for Crew and Cargo Transportation to Orbit|url=http://www.spaceref.com/news/viewpr.html?pid=18791|publisher=spaceref.com|accessdate=2008年2月11日}}&lt;/ref&gt;。NASAの計画では、[[国際宇宙ステーション]] (ISS) へのペイロード輸送に関する民間企業の打ち上げ能力開発を支援するために50億ドルの融資を行うことを計画している。精度の高い[[軌道投入]]とISSへの[[ランデブー (宇宙開発)|ランデブー]]、また別の宇宙船へのドッキングの必要があるため、これは現在のどの民間宇宙飛行業務より難しい。商業企業は特定のサービスエリアへの参加を予定している&lt;ref&gt;{{cite web|title=GUIDANCE_FOR_THE_PREPARATION_AND_SUBMISSION_OF_UNSOLICITED_PROPOSALS|url=http://ec.msfc.nasa.gov/hq/library/unSol-Prop.html|publisher=nasa.gov|accessdate=2008年2月13日}}&lt;/ref&gt;。
+
+NASAの管理者である[[マイケル・D・グリフィン]]は、『''手頃な[[商業軌道輸送サービス]]がなければ、政府機関には[[宇宙開発の展望]]&lt;ref&gt;{{Cite web|url=http://www.nasa.gov/mission_pages/exploration/main/index.html|title=NASA - Exploration Home|publisher=nasa.gov|accessdate=2008年7月25日}}&lt;/ref&gt;の目的を達成するために残っている基金が十分でない''』と述べた。
+
+2006年8月18日、NASAは[[SpaceX]] (Space Exploration Technologies、SpaceX) と[[ロケットプレーン・キスラー]] (Rocketplane Kistler、RpK) の2社がCOTS計画の第1段階での勝者となったことを発表した&lt;ref&gt;{{cite web|title=NASA Invests in Private Sector Space Flight with SpaceX、Rocketplane-Kistler|url=http://www.nasa.gov/mission_pages/exploration/news/COTS_selection.html|publisher=nasa.gov|accessdate=2008年2月14日}}&lt;/ref&gt;。NASAは、ISSに対するCOTSサービスが少なくとも2015年までには必要になると予想している。NASAの管理者は輸送サービスの調達を軌道上の燃料輸送まで広げることと月面までの輸送がCOTSの第一段階の成功に繋がるならばそちらの方面でのサービスを行うことを勧めた&lt;ref&gt;{{cite web|title=Human_Space_Flight_Transition_Plan|url=http://spaceoperations.nasa.gov/tran_plan.pdf|publisher=nasa.gov|accessdate=2008年2月14日}}&lt;/ref&gt;。
+
+また、2008年6月18日、ファーストアドバンテージ社とロケットプレーン・キスラー・ジャパンは宇宙[[結婚式]]の申し込み受付を2008年7月1日より開始すると発表した&lt;ref name="kistlerjapan"&gt;{{cite news|url=http://www.sorae.jp/030704/2445.html|title=宇宙ウエディング、2億4000万円|publisher=sorae.jp|date=2008年6月19日|accessdate=2008年7月25日}}&lt;/ref&gt;。飛行時間は約1時間で、訓練に4日を要し、費用は2億4000万円となっている&lt;ref name="kistlerjapan" /&gt;&lt;ref&gt;{{cite web|url=http://spacewedding.jp/|title=宇宙で結婚式! 宇宙ウェディング|publisher=space wedding|accessdate=2008年7月25日}}&lt;/ref&gt;([[結婚式#宇宙で行われるもの]]参照)。
+
+=== 個人宇宙旅行の実現 ===
+[[ファイル:Spaceship One in flight 1.jpg|thumb|250px|right|スペースシップワンは5メートルの翼幅と3人分のキャビンを持つ。]]
+{{Main|宇宙旅行}}
+
+2004年以前にはどんな個人出資の有人宇宙飛行も実現したことはなかった。[[スペースシャトル]]に同乗しての宇宙旅行か、ロシアの[[ソユーズ]]で打ち上げられる[[ミール]]に同乗しての[[国際宇宙ステーション]]への往復が唯一の民間人宇宙旅行の手段だった。
+
+世界初の民間人宇宙旅行は[[デニス・チトー]]によるもので、彼は国際宇宙ステーション (ISS) を訪れるための旅費を個人出資し政府機関の宇宙船を使用して2001年にISSへ宇宙旅行し帰還した&lt;ref name="soyuz1"&gt;{{Cite news|url=http://www.sorae.jp/030701/2793.html|title=ソユーズによる宇宙旅行は2009年3月で終了|publisher=sorae.jp|date=2003年7月1日|accessdate=2009年1月28日}}&lt;/ref&gt;。
+
+その他の旅行としては1986年に[[コロンビア (オービタ)|コロンビア号]]に同乗したアメリカ合衆国連邦議会委員の[[ビル・ネルソン]]と1990年にロシアの宇宙船ソユーズでミール宇宙ステーションを訪れた[[秋山豊寛]]、同じく1998年8月13日にロシアの[[バイコヌール宇宙基地]]からソユーズにてミールを訪れた[[ガチャピン]]がいる&lt;ref name="gachapin"&gt;{{Cite web|url=http://www.fujitv.co.jp/jp/kumorepo/gachapin/|title=ガチャピン宇宙へ行く!|publisher=[[フジテレビジョン|フジテレビ]]|year=1998年|accessdate=2008年7月31日}}&lt;/ref&gt;。
+
+* ソユーズでISSを訪れた民間人&lt;ref name="soyuz1" /&gt;
+# 2001年 - デニス・チトー
+# 2002年 - [[マーク・シャトルワース]]
+# 2005年 - [[グレゴリー・オルセン]]
+# 2006年 - [[アニューシャ・アンサリー]]
+# 2007年 - [[チャールズ・シモニー]]
+# 2008年 - [[リチャード・ギャリオット]]
+
+[[アンサリ・エックスプライズ]]は民間による宇宙飛行技術を競うコンテストである。[[2004年]][[6月21日]]に[[スペースシップワン]]は高度100[[キロメートル]]に到達し、世界初の民間宇宙船による[[有人宇宙飛行]]を達成した。2004年[[10月4日]]にはエックスプライズの獲得条件も達成し、1番乗りの賞金として1,000万ドルを獲得した&lt;ref&gt;{{Cite news|url=http://wiredvision.jp/archives/200410/2004100501.html|title=『スペースシップワン』、ついにXプライズを獲得|publisher=[[WIRED VISION]]|date=2004年10月5日|accessdate=2008年7月28日}}&lt;/ref&gt;。
+
+[[2004年]][[9月27日]]、スペースシップワンが成功を収めた後、[[リチャード・ブランソン]]は [[ヴァージン・グループ]]と[[バート・ルータン]]の経営権、スペースシップワンのデザイナーである[[ヴァージン・ギャラクティック]]と機体に関する技術のライセンス、及び2年半 - 3年後までに商業宇宙飛行を可能にする計画を取得したと発表した。5隻の機体を完成させ、飛行に掛ける経費は20万ドルであり、ブランソンは彼の計画で長期の宇宙飛行をより手頃にするための出資であると述べた。
+
+2004年12月、合衆国大統領[[ジョージ・W・ブッシュ]]は商業宇宙打ち上げ条約改正&lt;ref&gt;{{cite web|title=House Approves H.R. 3752、The Commercial Space Launch Amendments Act of 2004|url=http://www.spaceref.com/news/viewpr.html?pid=13774|publisher=spaceref.com|accessdate=2008年2月14日}}&lt;/ref&gt;条例に調印した。条例では民間での宇宙飛行に関する曖昧だった部分を定義し、既に出現しているアメリカ国内での商業有人宇宙飛行産業 (U.S. commercial human space flight industry) を発展・促進するように定められている。
+
+[[2006年]][[7月12日]]、[[ビゲロー・エアロスペース|ビゲロー・エアロスペース社]]は[[ジェネシスI]]を打ち上げ、軌道周回宇宙ステーションのモジュールとした。[[2007年]][[6月28日]]には[[ジェネシスII]]の打ち上げを行い、これらの計画では[[BA330]]宇宙船の追加原型となる予定である。
+
+2006年[[9月28日]]、[[ジム・ベンソン]]は[[SpaceDev|SpaceDev社]]を創立し、[[ジェームス・ベンソン|ベンソン・スペース・カンパニー社]]の設立及び垂直発射と水平着陸を行うNASAのHL-20をベースに開発した[[ドリーム・チェイサー]]民間打ち上げ運用機を運用する最も安く最も安全に民間宇宙飛行を売り出す会社であると発表した。
+
+また、ソユーズの民間宇宙飛行は[[2009年]]3月で終了することが報じられている&lt;ref name="soyuz1" /&gt;。
+
+== 失敗した民間宇宙飛行ベンチャー ==
+[[ファイル:X-33 Venture Star.jpg|thumb|250px|[[ロッキード・マーティン]]・[[ベンチャースター]] (NASA)]]
+1990年代、[[通信衛星]]打ち上げ事業の開始に伴い、需要の高い映像配信プロバイダは多くの商業市場で事業の開発に関心を持った。288の衛星を持つ[[テレデシック]]ネットワークなど、通信衛星事業最大手が開発に失敗したとき、市場の要求は消え失せた。民間部門と[[国防総省]]からなる軍産複合体との競合するNASAの行動傾向のために、幾つかの民間宇宙開発ベンチャーの発展が妨げられている。
+
+=== ベンチャースター ===
+{{Main|ベンチャースター}}
+
+[[1996年]]、[[アメリカ航空宇宙局|NASA]]は[[ロッキード・マーティン|ロッキード・マーティン社]]と[[スカンクワークス|スカンクワークス社]]を指定し、[[再使用型宇宙往還機]]である[[単段式宇宙往還機]] (SSTO)ベンチャースターを製作するように命じた。ベンチャースターはフルスケールの商業輸送宇宙機となる予定のものであった。まずはベンチャースターの試作機である[[X-33 (航空機)|X-33]]を開発することとなった。1999年、X-33のサブスケール原型試作機は合成液体燃料タンクのテスト期間中に失敗が続き、NASAは9億1,200万ドルの資金を供給したが、[[2001年]][[3月31日]]に計画中止となった。ロッキード・マーティン社は3億5,700万ドルの投資を行い、うち1,200万ドルが宇宙船の開発に投入された&lt;ref&gt;{{cite web|title=NASA Reaches Milestone in Space Launch Initiative Program|url=http://www.hq.nasa.gov/office/pao/History/x-33/01-31.htm|publisher=nasa.gov|accessdate=2008年2月14日}}&lt;/ref&gt;。
+
+=== ビール・エアロスペース社 ===
+{{Main|:en:Beal Aerospace}}
+
+1997年、[[ビール・エアロスペース|ベール・エアロスペース社]]は低コスト重量物打ち上げ機としてBA-2計画を立ち上げた。[[2000年]][[3月4日]]、BA-2計画のテストで大型[[ロケットエンジンの推進剤#液体燃料ロケット|液体燃料ロケット]]エンジンとして[[サターンVロケット]]のものを使用した&lt;ref&gt;{{cite web|title=Beal BA-2|url=http://www.astronautix.com/lvs/bealba2.htm|publisher=astronautix.com|accessdate=2008年2月14日}}&lt;/ref&gt;。2000年10月、ベール・エアロスペース社はNASAとアメリカ国防総省の[[エヴォーブド・エクスペンダブル・ローンチ・ビーグル]] (Evolved Expendable Launch Vehicle, (EELV)) 計画への融資に伴い、EELVの開発に専念するという主旨に従い計画を中止した&lt;ref&gt;{{cite press release | publisher=spaceprojects.com | date=2000年3月23日 | title=Beal Aerospace regrets to announce that it is ceasing all business operations effective October 23、2000 | url=http://www.spaceprojects.com/Beal/ | accessdate=2007年6月21日}}&lt;/ref&gt;。
+
+=== ロータリー・ロケット ===
+{{Main|:en:Rotary Rocket}}
+
+1998年、ロットン社 (Roton) は[[ロータリー・ロケット]]計画を立ち上げ、[[単段式宇宙往還機]](SSTO) にパイロットを乗せ垂直発進と着陸 ([[垂直離着陸機|VTOL]]) を行う宇宙輸送を計画した&lt;ref&gt;{{cite web|title=Roton|url=http://www.astronautix.com/craft/roton.htm|publisher=astronautix.com|accessdate=2008年2月14日}}&lt;/ref&gt;。1999年、ロットン・アトモスフェリック (Roton Atmospheric) のフルスケールテストは3回の飛行が行われた。2001年、ロータリー・ロケットの開発費は何千万ドルにも膨らんだが、ロットン社は開発着手に値する打上げ契約の獲得に失敗し、ロータリー・ロケット計画は中止された。
+
+== 未来の計画 ==
+多くの近未来の民間宇宙飛行計画が予想されているが、1つの可能性として[[スペースシップワン]]のような低軌道宇宙観光旅行のようなものがある。更に、低軌道宇宙船としてはより速い大陸間の物品配送や旅客便のようなサービスも想定されている。
+
+=== 民間宇宙旅行と宇宙ステーション ===
+[[スペースX|スペースX社]]の[[ファルコン9]]ロケットは2008年6月下旬に最初の打ち上げを計画され、2008年6月3日、スペースX社は[[5月29日]]に[[テキサス州]]の試験施設で行われたファルコン9に用いられるエンジン5基の同時燃焼試験が成功したことを発表した&lt;ref&gt;{{Cite news|url=http://www.sorae.jp/030807/2417.html|title=ファルコン9、エンジン5基の燃焼試験|publisher=[http://www.sorae.jp/ sorae.jp]|date=2008年6月5日|accessdate=2008年8月3日}}&lt;/ref&gt;。有人飛行のための[[安全性証明]]テストも完了している。この証明を受けるのはアメリカの[[スペースシャトル]]以来、軌道飛行船としては初であり、宇宙船が軌道に乗る際に有料で旅客を行うことを可能にする。[[2006年]][[3月6日]]、計画のフルスケール実験機は[[ドラゴン (宇宙船)|ドラゴン]]と名付けられ、7人の旅客カプセルの輸送が可能であると発表された&lt;ref&gt;{{cite news|first=Keith|last=Cowing|title=The SpaceX Dragon: America's First Privately Financed Manned Orbital Spacecraft?|url=http://www.spaceref.com/news/viewnews.html?id=1095|publisher=SpaceRef.com|accessdate=2008年2月12日|date=2006年3月6日}}&lt;/ref&gt;。
+
+初期のファルコン9の飛行計画はビゲロー・エアロスペース社が製作した試験機がスペース・コンプレックス・モジュール&lt;span style="font-size:90%;"&gt;(NASA設計の[[:en:Transhab|Transhab]]に似せたデザイン)&lt;/span&gt;だった。ビゲロー・エアロスペース社はモジュールを微少重力下で使用することに関した研究を行い、宇宙での製造と、モジュールを軌道上でのホテルサービスとして使用する[[宇宙旅行]]を計画した。また民間打ち上げ施設のために、ビゲロー・エアロスペース社は[[アメリカ・スペース・プライズ|アメリカ・スペース・プライズ社]]に5,000万ドルを融資した。アメリカを拠点とする有人民間宇宙旅行ファンドチームによる最初の再利用可能な宇宙船による宇宙旅行は[[2010年]][[1月10日]]ごろになると計画されている。
+
+[[XCORエアロスペース|XCORエアロスペース社]]は[[弾道飛行]]による商業宇宙飛行サービスを[[リンクス・ロケットプレーン]]で行うことを計画している。最初のテストフライト計画は[[2010年]]を予定している。
+
+[[エクスカリバー・アルマース]]の現代的な[[アルマース (宇宙ステーション)|アルマース]]宇宙ステーションの打ち上げ計画では、宇宙旅行かその他の使用用途が計画されている。そう遠くない未来に大型の窓を持つ宇宙船も構想されている。
+
+=== 軌道上の燃料給油ステーション ===
+[[2005年]][[11月15日]]の第52回[[アメリカン・アストロノーティカル・ソサエティ]]にて行われたプレゼンテーションで、NASAの管理者であるマイケル・D・グリフィンは軌道上に燃料給油ステーションを確立することが必要であると説き、『''産業と市場にあるべき企業の形''』と述べた&lt;ref&gt;{{cite web | url = http://www.nasa.gov/pdf/138033main_griffin_aas1.pdf | title = NASA and the Business of Space | publisher = NASA|accessdate=2008年2月12日}}&lt;/ref&gt;。
+
+2007年の宇宙技術応用国際フォーラム&lt;span style="font-size:90%;"&gt; (the Space Technology and Applications International Forum) &lt;/span&gt;では、[[ボーイング|ボーイング社]]のダラス・ビーンホッフは燃料給油ステーションに関する詳細な利益のプレゼンテーションを作成した&lt;ref&gt;{{cite web | url = http://www.boeing.com/defense-space/space/constellation/references/presentations/Potential_Impact_of_LEO_Propellant_on_NASA_ESAS_Architecture.pdf | title = The Potential Impact of a LEO Propellant Depot on the NASA ESAS Architecture | publisher = [[ボーイング|ボーイング社]]|accessdate=2008年2月12日}}&lt;/ref&gt;。
+
+=== 小惑星採掘 ===
+{{Main|:en:asteroid mining}}
+
+[[小惑星]]に埋蔵されている[[金属|金属資源]]に関する[[鉱業]]の推測も行われている。いくつかの試算に従うと、直径1[[キロメートル]]の小惑星には3,000万[[トン]]の[[ニッケル]]、1,500万トンの[[コバルト]] と7,500トンの[[白金]]が眠っている&lt;ref&gt;{{cite web|title=How Asteroid Mining Will Work|url=http://science.howstuffworks.com/asteroid-mining1.htm|publisher=howstuffworks.com|accessdate=2008年2月12日}}&lt;/ref&gt;&lt;ref&gt;{{cite web|title=Platinum Price|url=http://platinumprice.org/|publisher=platinumprice.org|accessdate=2008年3月13日}}&lt;/ref&gt;。
+
+=== 宇宙エネルギー資源 ===
+{{Main|:en:space manufacturing|経済発展}}
+
+=== 軌道エレベータ ===
+{{Main|軌道エレベータ}}
+
+軌道エレベータは実現可能な打ち上げ用システムで、少なくとも1つの民間宇宙事業で実現の可能性が模索されている&lt;ref&gt;{{cite web|title=The LiftPort Space Elevator|url=http://www.liftport.com/|publisher=liftport.com|accessdate=2008年2月11日}}&lt;/ref&gt;。
+
+== 脚注 ==
+{{脚注ヘルプ}}
+&lt;div class="reflist4" style="height:220px; overflow:auto; padding:3px;"&gt;
+{{Reflist|2}}
+&lt;/div&gt;
+
+== 関連項目 ==
+* [[:en:Benson Space Company]]
+* [[ブルーオリジン]]
+* [[:en:Heinlein Prize for Advances in Space Commercialization]]
+* [[:en:Masten Space Systems]]
+* [[:en:X Prize Foundation]]
+* [[:en:XCOR Aerospace]]
+* [[有人宇宙飛行]]
+* [[宇宙飛行]]
+* [[宇宙旅行]]
+
+== 外部リンク ==
+{{ウィキポータルリンク|宇宙開発}}
+; 日本語
+* [http://spaceinfo.jaxa.jp/ 宇宙情報センター] - [[宇宙航空研究開発機構|JAXA]]
+* [http://www.sorae.jp/ sorae.jp 宇宙(そら)へのポータルサイト]
+; 英語
+* [http://www.hobbyspace.com/AAdmin/archive/SpecialTopics/toSpaceTimeLine.html Climbing a Commercial Stairway to Space: A Plausible Timeline] RLV News、2006年2月2日付
+* [http://spaceliberates.us/news/an-introduction-to-private-spaceflight/ An Introduction to Private Spaceflight] Space Liberates Us!、2007年3月20日付
+
+=== アメリカ合衆国政府公報 ===
+* [http://www.nesdis.noaa.gov/space/library/reports/2002-10-suborbital-LowRes.pdf Suborbital Reusable Launch Vehicles and Applicable Markets] DOC OSC、2002年
+
+=== ベンチャー企業 ===
+* [http://www.candspace.com/ C&amp;SPACE]
+* [http://www.starchaser.co.uk/ Starchaser Industries]
+* [http://www.space-frontier.org/commercialspace/ Commercial Space Companies] Space Frontier Foundation{{en icon}}
+* [http://www.spaceservicesinc.com/ Space Services、Inc.]
+
+=== メディア報道 ===
+* [http://www.spaceref.com/news/viewsr.html?pid=12252 A Word from the Know-Nothing Bureaucrats] NASA union viewpoint on private spaceflight
+* [http://www.space-frontier.org/OpEds/20050214privateindustry.html Private Industry Can Help NASA Open the Space Frontier] Space Frontier Foundation、2005年2月14日。
+
+{{DEFAULTSORT:みんかんうちゆうひこう}}
+[[Category:宇宙旅行]]
+
+[[de:Private Raumfahrt]]
+[[en:Private spaceflight]]
+[[es:Vuelo espacial privado]]
+[[fr:Vol spatial privé]]
+[[sv:Privat rymdfart]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/熱圏.xml b/WptscsTest/Data/MediaWiki/ja/熱圏.xml
new file mode 100644 (file)
index 0000000..6084c92
--- /dev/null
@@ -0,0 +1,107 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>熱圏</title>\r
+    <id>57837</id>\r
+    <revision>\r
+      <id>34005303</id>\r
+      <timestamp>2010-09-14T21:44:53Z</timestamp>\r
+      <contributor>\r
+        <username>Xqbot</username>\r
+        <id>273540</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 変更: [[ar:ثيرموسفير]]</comment>\r
+      <text xml:space="preserve">{{地球大気の鉛直構造}}
+
+'''熱圏'''('''ねつけん、thermosphere''')は[[地球]]にある[[大気]]の層の一つ。[[大気の鉛直構造]]において[[中間圏]]の外側に位置する。この上には[[外気圏]]がある。中間圏との境界は'''中間圏界面'''(高度約80km)と呼ばれる。thermo は[[ギリシャ語]]で熱の意。
+
+[[太陽]]からの短波長の[[電磁波]]や[[磁気圏]]で加速された[[電子]]のエネルギーを吸収するため[[温度]]が高いのが特徴である。2,000℃まで上昇することがある。
+
+熱圏の温度は、あくまでも分子の平均運動量によって定義される。分子の密度が地表と比べてきわめて低いため、実際にそこに行っても大気から受ける熱量は小さく熱さは感じられないはずである。
+
+熱圏の大気の分子は太陽からの電磁波や磁気圏で加速された電子のエネルギーを吸収して一部が[[電離]]している。この電離したイオンと電子が層になっているのが[[電離層]]である。熱圏にはE層、F1層、F2層(夜間は合わさってF層となる)が存在し、また季節によって[[スポラディックE層]]が出現する。
+
+また高緯度地方では磁気圏で加速された電子などが次々に流入し、熱圏の大気の分子に衝突してそれを[[励起]]や[[電離]]させ、その分子が元に戻るときに発光する現象が見られる。これが[[オーロラ]]である。
+
+中間圏より下では混合によって大気中の分子の存在比は一様になるが、熱圏は大気の密度が低いため十分に混合せず、重力による分離が起こる。分子量の大きな分子が下に集まるため、80-100 kmでは窒素が
+主成分、170 kmより上では酸素原子が、1,000 km程度ではヘリウムが多い。
+
+{{地球の大気}}
+
+{{DEFAULTSORT:ねつけん}}
+[[Category:気象]]
+[[Category:大気]]
+{{sci-stub}}
+
+[[ar:ثيرموسفير]]
+[[az:Termosfer]]
+[[bg:Термосфера]]
+[[bo:ཚ་རིམ།]]
+[[ca:Termosfera]]
+[[ckb:تێرمۆسفەر]]
+[[cs:Termosféra]]
+[[da:Termosfære]]
+[[de:Thermosphäre]]
+[[el:Θερμόσφαιρα]]
+[[en:Thermosphere]]
+[[es:Termosfera]]
+[[et:Termosfäär]]
+[[eu:Termosfera]]
+[[fr:Thermosphère]]
+[[gl:Termosfera]]
+[[he:תרמוספירה]]
+[[hr:Termosfera]]
+[[ht:Tèmosfè]]
+[[hu:Termoszféra]]
+[[it:Termosfera]]
+[[ko:열권]]
+[[lv:Termosfēra]]
+[[ms:Termosfera]]
+[[nl:Thermosfeer]]
+[[nn:Termosfæren]]
+[[no:Termosfæren]]
+[[pl:Termosfera]]
+[[pt:Termosfera]]
+[[ro:Termosferă]]
+[[ru:Термосфера]]
+[[simple:Thermosphere]]
+[[sk:Termosféra]]
+[[sr:Термосфера]]
+[[sv:Termosfär]]
+[[th:เทอร์โมสเฟียร์]]
+[[uk:Термосфера]]
+[[vi:Tầng nhiệt]]
+[[zh:热成层]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/近点・遠点.xml b/WptscsTest/Data/MediaWiki/ja/近点・遠点.xml
new file mode 100644 (file)
index 0000000..e4f38fb
--- /dev/null
@@ -0,0 +1,116 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>近点・遠点</title>\r
+    <id>12448</id>\r
+    <revision>\r
+      <id>33797695</id>\r
+      <timestamp>2010-09-02T01:45:55Z</timestamp>\r
+      <contributor>\r
+        <username>SieBot</username>\r
+        <id>126695</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>ロボットによる 追加: [[mr:उपनाभी बिंदू]]</comment>\r
+      <text xml:space="preserve">[[画像:Elliptical-orbit.png|right|thumb|250px|近地点と遠地点の位置関係]]
+'''近点・遠点'''(きんてん・えんてん)または'''近星点・遠星点'''(きんせいてん・えんせいてん) (periapsis and apoapsis) とは、[[軌道 (力学)|軌道]]運動する[[天体]]が、主星の重力中心に最も近づく位置と、最も遠ざかる位置のことである。特に、主星が[[太陽]]のとき'''近日点・遠日点'''(きんじつてん・えんじつてん) (perihelion and aphelion)、主星が[[地球]]のとき'''近地点・遠地点'''(きんちてん・えんちてん) (perigee and apogee) という。[[人工衛星]]については'''ペリジー・アポジー'''ということもある。近点と遠点を総称して'''アプシス''' (apsis) とも言う。
+
+[[放物線軌道]]と[[双曲線軌道]]には近点しかないが、[[楕円軌道]]には近点と遠点がある。そのとき、遠点・近点および主星の[[重力]]中心は一直線をなし、この直線は[[楕円]]の長軸に一致する。
+
+主星の重力中心から近点までの距離を近点距離(近日点距離、近地点距離)、遠点までの距離を遠点距離(遠日点距離、遠地点距離)といい、それぞれ[[軌道要素]]の1つである。[[軌道長半径]]、[[離心率]]、近点距離、遠点距離の4つの軌道要素のうち2つを指定すれば、軌道の[[2次元]]的な形状が決まる。通常、軌道長半径と離心率が使われるが、放物線軌道・双曲線軌道(特に、[[彗星]]の軌道)については通常の意味での軌道長半径を定義できないので、近点距離と離心率が使われる。なお、人工衛星については近地点高度・遠地点高度という言葉もあるが、これらは地球の海面([[ジオイド]])からの距離である。
+
+他の天体による[[摂動]]、[[一般相対論]]的効果により、近点は(したがって遠点も)少しずつ移動することがある。これを[[近日点移動|近点移動]](近日点移動、近地点移動)という。
+
+== 関連項目 ==
+* [[人工衛星の軌道]]
+* [[楕円軌道]]
+
+[[Category:軌道|きんてんえんてん]]
+[[Category:太陽系|きんてんえんてん]]
+
+[[als:Apsis (Astronomie)]]
+[[ar:قبا]]
+[[bg:Апсида (астрономия)]]
+[[bn:অপদূরবিন্দু]]
+[[bs:Periapsis]]
+[[ca:Àpside]]
+[[cs:Apsida (astronomie)]]
+[[da:Apsis (astronomi)]]
+[[de:Apsis (Astronomie)]]
+[[el:Αφήλιο]]
+[[en:Apsis]]
+[[eo:Apsido]]
+[[es:Apoastro]]
+[[et:Apogee]]
+[[fa:اوج و حضیض]]
+[[fi:Apogeum]]
+[[fr:Apsides]]
+[[ga:Apaigí]]
+[[he:אפסיד]]
+[[hi:सूर्योच्य]]
+[[hr:Periapsis]]
+[[ht:Afeli]]
+[[hu:Apszispont]]
+[[id:Apsis]]
+[[io:Apsido (astronomio)]]
+[[it:Apside]]
+[[ka:აპოცენტრი და პერიცენტრი]]
+[[kk:Афелий]]
+[[ko:장축단]]
+[[la:Apsis]]
+[[lb:Perihel]]
+[[lt:Apsidė (astronomija)]]
+[[lv:Apsīda]]
+[[ml:അപസൗരം]]
+[[mr:उपनाभी बिंदू]]
+[[ms:Apsis]]
+[[nds:Apsis (Astronomie)]]
+[[nl:Apofocus en perifocus]]
+[[nn:Aphel]]
+[[no:Apsis (astronomi)]]
+[[pl:Perycentrum]]
+[[pt:Apoastro]]
+[[ru:Апоцентр и перицентр]]
+[[simple:Aphelion]]
+[[sk:Apsida (astronómia)]]
+[[sl:Apsidna točka]]
+[[sr:Периапсис]]
+[[sv:Apsis]]
+[[ta:சுற்றுப்பாதை வீச்சு]]
+[[th:จุดปลายระยะทางวงโคจร]]
+[[tr:Enberi]]
+[[uk:Перицентр та апоцентр]]
+[[vi:Củng điểm quỹ đạo]]
+[[zh:拱點]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/ja/遠地点.xml b/WptscsTest/Data/MediaWiki/ja/遠地点.xml
new file mode 100644 (file)
index 0000000..63891a4
--- /dev/null
@@ -0,0 +1,48 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="ja">\r
+  <siteinfo>\r
+    <sitename>Wikipedia</sitename>\r
+    <base>http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</base>\r
+    <generator>MediaWiki 1.16wmf4</generator>\r
+    <case>first-letter</case>\r
+    <namespaces>\r
+      <namespace key="-2" case="first-letter">メディア</namespace>\r
+      <namespace key="-1" case="first-letter">特別</namespace>\r
+      <namespace key="0" case="first-letter" />\r
+      <namespace key="1" case="first-letter">ノート</namespace>\r
+      <namespace key="2" case="first-letter">利用者</namespace>\r
+      <namespace key="3" case="first-letter">利用者‐会話</namespace>\r
+      <namespace key="4" case="first-letter">Wikipedia</namespace>\r
+      <namespace key="5" case="first-letter">Wikipedia‐ノート</namespace>\r
+      <namespace key="6" case="first-letter">ファイル</namespace>\r
+      <namespace key="7" case="first-letter">ファイル‐ノート</namespace>\r
+      <namespace key="8" case="first-letter">MediaWiki</namespace>\r
+      <namespace key="9" case="first-letter">MediaWiki‐ノート</namespace>\r
+      <namespace key="10" case="first-letter">Template</namespace>\r
+      <namespace key="11" case="first-letter">Template‐ノート</namespace>\r
+      <namespace key="12" case="first-letter">Help</namespace>\r
+      <namespace key="13" case="first-letter">Help‐ノート</namespace>\r
+      <namespace key="14" case="first-letter">Category</namespace>\r
+      <namespace key="15" case="first-letter">Category‐ノート</namespace>\r
+      <namespace key="100" case="first-letter">Portal</namespace>\r
+      <namespace key="101" case="first-letter">Portal‐ノート</namespace>\r
+      <namespace key="102" case="first-letter">プロジェクト</namespace>\r
+      <namespace key="103" case="first-letter">プロジェクト‐ノート</namespace>\r
+    </namespaces>\r
+  </siteinfo>\r
+  <page>\r
+    <title>遠地点</title>\r
+    <id>12450</id>\r
+    <redirect />\r
+    <revision>\r
+      <id>8895261</id>\r
+      <timestamp>2006-11-17T13:16:43Z</timestamp>\r
+      <contributor>\r
+        <username>U3002</username>\r
+        <id>66126</id>\r
+      </contributor>\r
+      <minor />\r
+      <comment>[[近点・遠点]]へのリダイレクト</comment>\r
+      <text xml:space="preserve">#redirect[[近点・遠点]]</text>\r
+    </revision>\r
+  </page>\r
+</mediawiki>
\ No newline at end of file
diff --git a/WptscsTest/Data/MediaWiki/result/example.txt b/WptscsTest/Data/MediaWiki/result/example.txt
new file mode 100644 (file)
index 0000000..c911b51
--- /dev/null
@@ -0,0 +1,21 @@
+'''xxx'''([[英語|英]]: '''example''')\r
+\r
+[[ファイル:Example.png|thumb|Wikipedia's example image. (Example.png)]]\r
+[[:en:Template:wiktionary]]<!-- {{wiktionary}} -->\r
+[[:en:Template:wikiquote]]<!-- {{wikiquote}} -->\r
+'''Example''' may refer to:\r
+\r
+*[[:en:Example (rapper)|Example (rapper)]], a British rapper\r
+*[[Example.com|example.com]], [[Example.com|example.net]], [[Example.com|example.org]]  and [[トップレベルドメイン|.example]], domain names reserved for use in documentation as examples \r
+\r
+==関連項目==\r
+*[[:en:Exemplum|Exemplum]], medieval collections of short stories to be told in sermons\r
+*[[:en:Exemplar|Exemplar]], a prototype or model which others can use to understand a topic better\r
+\r
+[[:en:Template:disambig]]<!-- {{disambig}} -->\r
+\r
+[[fr:Example]]\r
+[[ksh:Example (Watt ėßß datt?)]]\r
+\r
+[[en:example]]\r
+<!-- Wikipedia 翻訳支援ツール Ver0.73、[[:en:example]](2010年7月13日 0:49:18(UTC))より -->\r
diff --git a/WptscsTest/Data/MediaWiki/result/example_キャッシュ使用.txt b/WptscsTest/Data/MediaWiki/result/example_キャッシュ使用.txt
new file mode 100644 (file)
index 0000000..ab76bd6
--- /dev/null
@@ -0,0 +1,21 @@
+'''xxx'''([[英語|英]]: '''example''')\r
+\r
+[[ファイル:Example.png|thumb|Wikipedia's example image. (Example.png)]]\r
+{{Wiktionary}}\r
+[[:en:Template:wikiquote]]<!-- {{wikiquote}} -->\r
+'''Example''' may refer to:\r
+\r
+*[[:en:Example (rapper)|Example (rapper)]], a British rapper\r
+*[[Example.com|example.com]], [[Example.com|example.net]], [[:en:example.org|example.org]]  and [[。さんぷる|.example]], domain names reserved for use in documentation as examples \r
+\r
+==関連項目==\r
+*[[:en:Exemplum|Exemplum]], medieval collections of short stories to be told in sermons\r
+*[[:en:Exemplar|Exemplar]], a prototype or model which others can use to understand a topic better\r
+\r
+{{曖昧さ回避}}\r
+\r
+[[fr:Example]]\r
+[[ksh:Example (Watt ėßß datt?)]]\r
+\r
+[[en:example]]\r
+<!-- Wikipedia 翻訳支援ツール Ver0.xx、[[:en:example]](2010年7月13日 0:49:18(UTC))より -->\r
diff --git a/WptscsTest/Data/MediaWiki/result/example_定型句なし.txt b/WptscsTest/Data/MediaWiki/result/example_定型句なし.txt
new file mode 100644 (file)
index 0000000..551acb9
--- /dev/null
@@ -0,0 +1,21 @@
+'''xxx'''([[英語|英]]: '''example''')\r
+\r
+[[ファイル:Example.png|thumb|Wikipedia's example image. (Example.png)]]\r
+[[:en:Template:wiktionary]]<!-- {{wiktionary}} -->\r
+[[:en:Template:wikiquote]]<!-- {{wikiquote}} -->\r
+'''Example''' may refer to:\r
+\r
+*[[:en:Example (rapper)|Example (rapper)]], a British rapper\r
+*[[Example.com|example.com]], [[Example.com|example.net]], [[Example.com|example.org]]  and [[トップレベルドメイン|.example]], domain names reserved for use in documentation as examples \r
+\r
+==See also==\r
+*[[:en:Exemplum|Exemplum]], medieval collections of short stories to be told in sermons\r
+*[[:en:Exemplar|Exemplar]], a prototype or model which others can use to understand a topic better\r
+\r
+[[:en:Template:disambig]]<!-- {{disambig}} -->\r
+\r
+[[fr:Example]]\r
+[[ksh:Example (Watt ėßß datt?)]]\r
+\r
+[[en:example]]\r
+<!-- Wikipedia 翻訳支援ツール Ver0.xx、[[:en:example]](2010年7月13日 0:49:18(UTC))より -->\r
diff --git a/WptscsTest/Data/MediaWiki/result/スペースシップツー.txt b/WptscsTest/Data/MediaWiki/result/スペースシップツー.txt
new file mode 100644 (file)
index 0000000..93072f1
--- /dev/null
@@ -0,0 +1,57 @@
+'''xxx''' ([[Japanese language|Japanese]]: '''スペースシップツー''') \r
+\r
+[[:ja:Template:Infobox 航空機]]<!-- {{Infobox 航空機\r
+  |名称 = スペースシップツー\r
+  |画像 = ファイル:SS2 and VMS Eve.jpg\r
+  |キャプション = \r
+  |用途 = [[スペースプレーン]]\r
+  |製造者 = [[スケールド・コンポジッツ]]\r
+  |運用状況 = 生産中(1号機は2009年12月7日ロールアウト)\r
+}} -->\r
+スケールド・コンポジッツ '''モデル339 スペースシップツー''' (Model 339 SpaceShipTwo, SS2) は、開発中の[[Space tourism|宇宙旅行者]]向けの[[Sub-orbital spaceflight|弾道飛行]][[Spaceplane|スペースプレーン]]である。[[Scaled Composites|スケールド・コンポジッツ]]と、[[Richard Branson|リチャード・ブランソン]]の[[Virgin Group|ヴァージン・グループ]]によるジョイントベンチャーである[[スペースシップ・カンパニー]] ([[:en:The Spaceship Company|The Spaceship Company]]) により、Tier 1bプログラムの一部として開発されている。2009年12月7日、[[California|カリフォルニア州]]の[[Mojave Air and Space Port|モハーヴェ宇宙港]]にて1号機'''[[VSSエンタープライズ]]'''が公開され、2010年3月22日には母機に吊るされて初飛行を行った<ref>[[:ja:Template:cite news]]<!-- {{cite news\r
+| title= VSSエンタープライズ“処女飛行”\r
+| url= http://www.nationalgeographic.co.jp/news/news_article.php?file_id=2010032508&expand\r
+| publisher=ナショナルジオグラフィック ニュース | date=2010-03-25 | accessdate=2010-03-28 }} --></ref>。\r
+\r
+宇宙航空会社の[[Virgin Galactic|ヴァージン・ギャラクティック]]は、2009年以前には行われたことのなかった乗客向けの[[Private spaceflight|民間宇宙飛行]]サービスを提供するために、この宇宙機を5機編成で運用する予定である<ref>[[:ja:Template:cite web]]<!-- {{cite web|url=http://www.nytimes.com/2008/01/23/science/space/23cnd-spaceship.html?hp|title=New Tourist Spacecraft Unveiled|accessdate=2008-01-23|author=John Schwartz|publisher=nytimes.com}} --></ref>。初めての宇宙飛行は2011年6月前後に行うとしている<ref>[[:ja:Template:cite web]]<!-- {{cite web|url=http://www.afpbb.com/article/environment-science-it/science-technology/2672434/5010250|title=格安宇宙旅行実現へ、ヴァージン・ギャラクティック 世界初の商用宇宙船を公開|date=2009-12-07|accessdate=2009-12-09|publisher=[[フランス通信社|AFPBB News]]}} --></ref>。\r
+\r
+== 設計と開発 ==\r
+[[File:Trajectoire-White-Knight.png|thumb|300px]]\r
+世界初の民間宇宙船[[SpaceShipOne|スペースシップワン]]は、[[Paul Allen|ポール・アレン]]が出資し、スケールド・コンポジッツが実施したTier Oneプログラムの一部として開発された。スペースシップツーはその技術の一部を基に作られている。スペースシップ・カンパニーはポール・アレンの[[モハーヴェ・エアロスペース・ベンチャーズ]]からライセンスを受けている。\r
+\r
+スペースシップツーは、8人の乗員(6人の乗客と2人のパイロット)を乗せることができる。飛行軌道の[[Apsis|遠地点]]はおよそ高度110&nbsp;km (68マイル)の[[Thermosphere|熱圏]]内である。これはスペースシップワンの目標高度である[[Kármán line|カーマン・ライン]]よりも10&nbsp;km (6マイル)高い(もっとも、スペースシップワンの最後のフライトは112&nbsp;kmに達している)。スペースシップツーは母機である[[Scaled Composites White Knight Two|ホワイトナイトツー]]から、高度15,200&nbsp;m (50,000フィート)で発射され、1基の[[Hybrid rocket|ハイブリッドロケット]]により4,200&nbsp;km/h (2,600 mph) の速度に達する。客室は長さ3.66&nbsp;m(12フィート)、直径2.28&nbsp;m(7.5フィート)である。<ref name="flightglobal-unveil">[[:ja:Template:cite web]]<!-- {{cite web |url=http://www.flightglobal.com/articles/2008/01/23/221031/pictures-virgin-galactic-unveils-dyna-soar-style-spaceshiptwo-design-and-twin-fuselage-white-knight.html|title=PICTURES: Virgin Galactic unveils Dyna-Soar style SpaceShipTwo design and twin-fuselage White Knight II configuration |accessdate=2008-01-23 |author=Rob Coppinger|publisher=flightglobal.com }} --></ref> 翼長は8.23&nbsp;m(27フィート)、全長は18.29&nbsp;m (60フィート)、尾翼の高さは4.57&nbsp;m(15フィート)である。\r
+\r
+==Notes==\r
+{{Reflist}}\r
+\r
+==External links==\r
+[[:ja:Template:commonscat]]<!-- {{commonscat|SpaceShipTwo}} -->\r
+*[http://www.scaled.com Scaled Composites] {{En icon}}\r
+\r
+==See Also==\r
+* [[Space tourism|宇宙旅行]]\r
+* [[Scaled Composites|スケールド・コンポジッツ]]\r
+\r
+{{Reusable launch systems}}\r
+\r
+{{DEFAULTSORT:すへすしつふ2}}\r
+[[Category:Manned spacecraft]]<!-- [[Category:宇宙船]] -->\r
+\r
+[[cs:SpaceShipTwo]]\r
+[[de:SpaceShipTwo]]\r
+\r
+[[eo:SpaceShipTwo]]\r
+[[es:SpaceShipTwo]]\r
+[[fa:فضاپیمای دو]]\r
+[[fr:SpaceShipTwo]]\r
+[[hu:SpaceShipTwo]]\r
+[[it:Scaled Composites SpaceShipTwo]]\r
+[[nl:SpaceShipTwo]]\r
+[[pl:SpaceShipTwo]]\r
+[[ru:SpaceShipTwo]]\r
+[[sk:SpaceShipTwo]]\r
+[[sv:SpaceShipTwo]]\r
+[[zh:太空船2号]]\r
+\r
+[[ja:スペースシップツー]]\r
+<!-- Wikipedia 翻訳支援ツール Ver0.73、[[:ja:スペースシップツー]](2010年5月16日 1:47:15(UTC))より -->\r
diff --git a/WptscsTest/Data/config.xml b/WptscsTest/Data/config.xml
new file mode 100644 (file)
index 0000000..7c12ff3
--- /dev/null
@@ -0,0 +1,482 @@
+<?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
+</Config>
\ No newline at end of file
diff --git a/WptscsTest/Logics/MediaWikiTranslatorTest.cs b/WptscsTest/Logics/MediaWikiTranslatorTest.cs
new file mode 100644 (file)
index 0000000..32bb65b
--- /dev/null
@@ -0,0 +1,348 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/ConfigTest.cs b/WptscsTest/Models/ConfigTest.cs
new file mode 100644 (file)
index 0000000..e385722
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Models/IgnoreCaseDictionaryTest.cs b/WptscsTest/Models/IgnoreCaseDictionaryTest.cs
new file mode 100644 (file)
index 0000000..8c57d7b
--- /dev/null
@@ -0,0 +1,221 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/LanguageTest.cs b/WptscsTest/Models/LanguageTest.cs
new file mode 100644 (file)
index 0000000..2451c7a
--- /dev/null
@@ -0,0 +1,176 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/MediaWikiPageTest.cs b/WptscsTest/Models/MediaWikiPageTest.cs
new file mode 100644 (file)
index 0000000..a848e05
--- /dev/null
@@ -0,0 +1,212 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/MediaWikiTest.cs b/WptscsTest/Models/MediaWikiTest.cs
new file mode 100644 (file)
index 0000000..6ea29ae
--- /dev/null
@@ -0,0 +1,365 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/PageTest.cs b/WptscsTest/Models/PageTest.cs
new file mode 100644 (file)
index 0000000..bec7e8b
--- /dev/null
@@ -0,0 +1,200 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/TestingConfig.cs b/WptscsTest/Models/TestingConfig.cs
new file mode 100644 (file)
index 0000000..47e0c20
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Models/TranslationDictionaryTest.cs b/WptscsTest/Models/TranslationDictionaryTest.cs
new file mode 100644 (file)
index 0000000..29a0dd6
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Models/TranslationTableTest.cs b/WptscsTest/Models/TranslationTableTest.cs
new file mode 100644 (file)
index 0000000..daa2985
--- /dev/null
@@ -0,0 +1,161 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Models/WebsiteTest.cs b/WptscsTest/Models/WebsiteTest.cs
new file mode 100644 (file)
index 0000000..c95880b
--- /dev/null
@@ -0,0 +1,235 @@
+// ================================================================================================\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
diff --git a/WptscsTest/PrivateAccessor.cs b/WptscsTest/PrivateAccessor.cs
new file mode 100644 (file)
index 0000000..a10656b
--- /dev/null
@@ -0,0 +1,378 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Properties/AssemblyInfo.cs b/WptscsTest/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..2f196c3
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Utilities/FormUtilsTest.cs b/WptscsTest/Utilities/FormUtilsTest.cs
new file mode 100644 (file)
index 0000000..57d12f9
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Utilities/LazyXmlParserTest.cs b/WptscsTest/Utilities/LazyXmlParserTest.cs
new file mode 100644 (file)
index 0000000..9489cf7
--- /dev/null
@@ -0,0 +1,334 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Utilities/ObjectUtilsTest.cs b/WptscsTest/Utilities/ObjectUtilsTest.cs
new file mode 100644 (file)
index 0000000..d208775
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Utilities/StringUtilsTest.cs b/WptscsTest/Utilities/StringUtilsTest.cs
new file mode 100644 (file)
index 0000000..81544ab
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/Utilities/ValidateTest.cs b/WptscsTest/Utilities/ValidateTest.cs
new file mode 100644 (file)
index 0000000..8384aee
--- /dev/null
@@ -0,0 +1,240 @@
+// ================================================================================================\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
diff --git a/WptscsTest/Utilities/XmlUtilsTest.cs b/WptscsTest/Utilities/XmlUtilsTest.cs
new file mode 100644 (file)
index 0000000..604f315
--- /dev/null
@@ -0,0 +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
diff --git a/WptscsTest/WptscsTest.csproj b/WptscsTest/WptscsTest.csproj
new file mode 100644 (file)
index 0000000..215dfb6
--- /dev/null
@@ -0,0 +1,247 @@
+<?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
+</Project>
\ No newline at end of file