using Honememo.Wptscs.Websites;
/// <summary>
- /// Wikipedia用の翻訳支援処理実装クラスです。
+ /// MediaWiki用の翻訳支援処理実装クラスです。
/// </summary>
public class MediaWikiTranslator : Translator
{
#region コンストラクタ
/// <summary>
- /// インスタンスを生成する。
+ /// MediaWikiでの翻訳支援処理を行うトランスレータを作成。
/// </summary>
+ /// <remarks>
+ /// 別途プロパティに必要なパラメータを設定する必要あり。
+ /// 通常は<see cref="Translator.Create"/>にて設定ファイルから作成する。
+ /// </remarks>
public MediaWikiTranslator()
{
// このクラス用のロガーと、デフォルトの確認処理としてメッセージダイアログ版を設定
// 対象記事に言語間リンクが存在する場合、処理を継続するか確認
// ※ 言語間リンク取得中は、処理状態を解析中に変更
- 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)
{
// 確認処理の最中は処理時間をカウントしない(ダイアログ等を想定するため)
// 言語間リンク・定型句の変換、実行中は処理状態を解析中に設定
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);
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() + ": ";
/// </summary>
/// <param name="title">翻訳支援対象の記事名。</param>
/// <returns>取得したページ。取得失敗時は<c>null</c>。</returns>
+ /// <remarks>
+ /// ここで取得した記事のURIを、以後の翻訳支援処理で使用するRefererとして登録
+ /// (ここで処理しているのは、リダイレクトの場合のリダイレクト先への
+ /// アクセス時にもRefererを入れたかったから。
+ /// リダイレクトの場合は、最終的には転送先ページのURIとなる)。
+ /// </remarks>
private MediaWikiPage GetTargetPage(string title)
{
// 指定された記事をWikipediaから取得、リダイレクトの場合その先まで探索
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;
}
/// <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>