OSDN Git Service

#27617 言語名へのリンクを行わない設定を追加し、Wikitravelの設定に言語名を追加,
[wptscs/wpts.git] / Wptscs / Logics / MediaWikiTranslator.cs
index d744718..9cf9997 100644 (file)
@@ -27,7 +27,7 @@ namespace Honememo.Wptscs.Logics
     using Honememo.Wptscs.Websites;
 
     /// <summary>
-    /// Wikipedia用の翻訳支援処理実装クラスです。
+    /// MediaWiki用の翻訳支援処理実装クラスです。
     /// </summary>
     public class MediaWikiTranslator : Translator
     {
@@ -43,8 +43,12 @@ namespace Honememo.Wptscs.Logics
         #region コンストラクタ
 
         /// <summary>
-        /// インスタンスを生成する
+        /// MediaWikiでの翻訳支援処理を行うトランスレータを作成
         /// </summary>
+        /// <remarks>
+        /// 別途プロパティに必要なパラメータを設定する必要あり。
+        /// 通常は<see cref="Translator.Create"/>にて設定ファイルから作成する。
+        /// </remarks>
         public MediaWikiTranslator()
         {
             // このクラス用のロガーと、デフォルトの確認処理としてメッセージダイアログ版を設定
@@ -130,10 +134,12 @@ namespace Honememo.Wptscs.Logics
 
             // 対象記事に言語間リンクが存在する場合、処理を継続するか確認
             // ※ 言語間リンク取得中は、処理状態を解析中に変更
-            MediaWikiLink interlanguage = null;
-            this.ChangeStatusInExecuting(
-                () => interlanguage = article.GetInterlanguage(this.To.Language.Code),
-                Resources.StatusParsing);
+            MediaWikiLink interlanguage;
+            using (var sm = this.StatusManager.Switch(Resources.StatusParsing))
+            {
+                interlanguage = article.GetInterlanguage(this.To.Language.Code);
+            }
+
             if (interlanguage != null)
             {
                 // 確認処理の最中は処理時間をカウントしない(ダイアログ等を想定するため)
@@ -153,9 +159,16 @@ namespace Honememo.Wptscs.Logics
             // 言語間リンク・定型句の変換、実行中は処理状態を解析中に設定
             this.Logger.AddSeparator();
             this.Logger.AddResponse(Resources.LogMessageStartParseAndReplace);
-            this.ChangeStatusInExecuting(
-                () => this.Text += this.ReplaceElement(article.Element, article).ToString(),
-                Resources.StatusParsing);
+            using (var sm = this.StatusManager.Switch(Resources.StatusParsing))
+            {
+                IElement element;
+                using (MediaWikiParser parser = new MediaWikiParser(this.From))
+                {
+                    element = parser.Parse(article.Text);
+                }
+
+                this.Text += this.ReplaceElement(element, article).ToString();
+            }
 
             // 記事の末尾に新しい言語間リンクと、コメントを追記
             this.Text += this.CreateEnding(article);
@@ -209,7 +222,7 @@ namespace Honememo.Wptscs.Logics
         protected virtual string CreateOpening(string title)
         {
             string langPart = String.Empty;
-            MediaWikiLink langLink = this.GetLanguageLink(this.From, this.To.Language.Code);
+            IElement langLink = this.GetLanguageLink();
             if (langLink != null)
             {
                 langPart = langLink.ToString() + ": ";
@@ -928,6 +941,12 @@ namespace Honememo.Wptscs.Logics
         /// </summary>
         /// <param name="title">翻訳支援対象の記事名。</param>
         /// <returns>取得したページ。取得失敗時は<c>null</c>。</returns>
+        /// <remarks>
+        /// ここで取得した記事のURIを、以後の翻訳支援処理で使用するRefererとして登録
+        /// (ここで処理しているのは、リダイレクトの場合のリダイレクト先への
+        /// アクセス時にもRefererを入れたかったから。
+        /// リダイレクトの場合は、最終的には転送先ページのURIとなる)。
+        /// </remarks>
         private MediaWikiPage GetTargetPage(string title)
         {
             // 指定された記事をWikipediaから取得、リダイレクトの場合その先まで探索
@@ -944,9 +963,14 @@ namespace Honememo.Wptscs.Logics
                     this.Logger.AddResponse(Resources.LogMessageTargetArticleNotFound);
                     break;
                 }
-                else if (!page.IsRedirect())
+
+                // 取得した記事のURIを以後のアクセスで用いるRefererとして登録
+                this.From.WebProxy.Referer = page.Uri.ToString();
+                this.To.WebProxy.Referer = page.Uri.ToString();
+
+                if (!page.IsRedirect())
                 {
-                    // ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88以å¤\96ã\82\82ã\81\93ã\81\93で終了
+                    // ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88以å¤\96ã\81ªã\82\89ã\81\93ã\82\8cで終了
                     break;
                 }
 
@@ -961,24 +985,48 @@ namespace Honememo.Wptscs.Logics
         /// <summary>
         /// 指定した言語での言語名称を [[言語名称|略称]]の内部リンクで取得。
         /// </summary>
-        /// <param name="site">サイト。</param>
-        /// <param name="code">言語のコード。</param>
-        /// <returns>[[言語名称|略称]]の内部リンク。登録されていない場合<c>null</c>。</returns>
-        private MediaWikiLink GetLanguageLink(Website site, string code)
+        /// <returns>
+        /// [[言語名称|略称]]の内部リンク。登録されていない場合<c>null</c>。
+        /// サーバーにそうした記事が存在しない場合、リンクではなく言語名称or略称の文字列を返す。
+        /// </returns>
+        private IElement GetLanguageLink()
         {
-            if (!site.Language.Names.ContainsKey(code))
+            // 言語情報を取得
+            Language.LanguageName name;
+            if (!this.From.Language.Names.TryGetValue(this.To.Language.Code, out name))
             {
                 return null;
             }
 
-            Language.LanguageName name = site.Language.Names[code];
-            MediaWikiLink link = new MediaWikiLink(name.Name);
+            // 略称を取得
+            IElement shortName = null;
             if (!String.IsNullOrEmpty(name.ShortName))
             {
-                link.PipeTexts.Add(new TextElement(name.ShortName));
+                shortName = new TextElement(name.ShortName);
             }
 
-            return link;
+            if (this.To.HasLanguagePage)
+            {
+                // サーバーにこの言語の記事が存在することが期待される場合、
+                // 内部リンクとして返す
+                MediaWikiLink link = new MediaWikiLink(name.Name);
+                if (shortName != null)
+                {
+                    link.PipeTexts.Add(shortName);
+                }
+
+                return link;
+            }
+            else if (shortName != null)
+            {
+                // 存在しない場合、まずあれば略称を返す
+                return shortName;
+            }
+            else
+            {
+                // 無ければ言語名を返す
+                return new TextElement(name.Name);
+            }
         }
 
         /// <summary>