みなさん、こんにちは。砂漠の果ての狼です。今日は、非常に便利なツール「Code World Workshop(コードワールドワークショップ)」をご紹介します。
Code World Workshopは、サイト管理者が新しく開発したオープンソースプロジェクトで、Webオンラインツールを提供するとともに、クロスプラットフォームのデスクトップおよびモバイルApp版も提供しています。私たちの目標は、より効率的で便利なオンラインツール体験を提供することです。本日、大変光栄に思います「記事タイトルURLエイリアス生成ツール」をリリースします。このツールは、記事タイトルのURLエイリアスを簡単に作成し、SEO効果とユーザー体験を向上させるのに役立ちます。
これはどんなツール?
こんな問題に遭遇したことはありませんか?素晴らしい記事を書いたのに、タイトルが長すぎたり特殊文字が含まれていたりして、URLが美しくなく、SEO効果に悪影響を及ぼすことがあります。今、「記事タイトルURLエイリアス生成ツール」を使えば、これらの問題はすべて解決します。
このツールは3つの機能を提供します:
- 中日英翻訳:中国語タイトルを英語に翻訳、または英語タイトルを中国語に翻訳。
- 英語からURLエイリアスへの変換:英語タイトルをシンプルなURLエイリアスに変換し、Webサイトで使用しやすくします。
- 中国語からURLエイリアスへの変換:中国語タイトルをシンプルなURLエイリアスに変換し、Webサイトで使用しやすくします。
特に、記事の中国語タイトルが決まった後、サイト公開時の記事アクセスリンク生成に最適です。例えば、本記事のタイトル「码坊“文章标题URL别名生成器”上线」をツールで変換すると、code-world-workshop-article-title-url-alias-generator-launched となります。変換結果は以下の通りです:

このツールをDotnet9サイトで公開すると、サイト上のアクセスURLは https://dotnet9.com/2024/01/code-world-workshop-article-title-url-alias-generator-launched になります。
中日英翻訳、エイリアス変換の実装
このツールの実装原理は非常にシンプルです。中日英翻訳には GTranslate パッケージの YandexTranslator クラスを使用しています。これはニューラルネットワーク機械翻訳技術(NMT)を採用しており、より高品質な翻訳結果を提供します。URLエイリアスの変換には Slugify.Core パッケージを使用しており、使い方も簡単で変換効果も良好です。
実装コードを見てみましょう。まず変換インターフェースを定義します:
namespace CodeWF.Core;
/// <summary>
/// 記事タイトル翻訳
/// </summary>
public interface ITranslationService
{
/// <summary>
/// 中国語→英語翻訳
/// </summary>
/// <param name="chineseText"></param>
/// <returns></returns>
public Task<string> ChineseToEnglishAsync(string? chineseText);
/// <summary>
/// 英語→中国語翻訳
/// </summary>
/// <param name="englishText"></param>
/// <returns></returns>
public Task<string> EnglishToChineseAsync(string? englishText);
/// <summary>
/// 英語をURLスラッグに変換
/// </summary>
/// <param name="englishText"></param>
/// <returns></returns>
public string EnglishToUrlSlug(string? englishText);
}
変換インターフェースの実装:
namespace CodeWF.Core;
/// <summary>
/// 中日英翻訳にはYandex Translationを使用。Yandexはニューラルネットワーク機械翻訳技術(NMT)を採用し、
/// より高品質な翻訳結果を提供します。Yandex Translationは多くの言語ペアをサポートし、一部の
/// 珍しい言語も含み、特にヨーロッパ言語間の翻訳に優れています。
/// </summary>
public class TranslationService : ITranslationService
{
private readonly YandexTranslator _translator = new();
private readonly SlugHelper _slugHelper = new();
/// <summary>
/// 中国語→英語翻訳
/// </summary>
/// <param name="chineseText"></param>
/// <returns></returns>
public async Task<string> ChineseToEnglishAsync(string? chineseText)
{
return string.IsNullOrWhiteSpace(chineseText)
? string.Empty
: (await _translator.TranslateAsync(chineseText, "en")).Translation;
}
/// <summary>
/// 英語→中国語翻訳
/// </summary>
/// <param name="englishText"></param>
/// <returns></returns>
public async Task<string> EnglishToChineseAsync(string? englishText)
{
return string.IsNullOrWhiteSpace(englishText)
? string.Empty
: (await _translator.TranslateAsync(englishText, "zh-CN")).Translation;
}
/// <summary>
/// 英語をURLスラッグに変換
/// </summary>
/// <param name="englishText"></param>
/// <returns></returns>
public string EnglishToUrlSlug(string? englishText)
{
return string.IsNullOrWhiteSpace(englishText) ? string.Empty : _slugHelper.GenerateSlug(englishText);
}
}
ユニットテストで検証:
namespace CodeWF.Core.Test;
[TestClass]
public class TranslationServiceUnitTest
{
private readonly ITranslationService _translationService = new TranslationService();
[TestMethod]
public async Task Test_ChineseToEnglishAsync_SUCCESS()
{
const string chineseText = "码坊";
var englishText = await _translationService.ChineseToEnglishAsync(chineseText);
Assert.AreEqual(englishText, "Code World Workshop");
}
[TestMethod]
public async Task Test_EnglishToChineseAsync_SUCCESS()
{
const string englishText = "Code World Workshop";
var chineseText = await _translationService.EnglishToChineseAsync(englishText);
Assert.AreEqual(chineseText, "代码世界工作坊");
}
[TestMethod]
public void Test_EnglishToSlug_SUCCESS()
{
const string englishText = "Code World Workshop";
var urlSlug = _translationService.EnglishToUrlSlug(englishText);
Assert.AreEqual(urlSlug, "code-world-workshop");
}
[TestMethod]
public async Task Test_ChineseToSlugAsync_SUCCESS()
{
const string chineseText = "码坊";
var englishText = await _translationService.ChineseToEnglishAsync(chineseText);
var urlSlug = _translationService.EnglishToUrlSlug(englishText);
Assert.AreEqual(urlSlug, "code-world-workshop");
}
}
最後に
文中のスクリーンショットはクロスプラットフォームデスクトップ版で、Avalonia UIとコントロールライブラリNeumorphism.Avaloniaを使用して開発されています。機能がある程度完成したら、サイト管理者はツールフレームワークの構築について紹介する予定です。以下はツールの効果画像です:


このツールに興味があれば、Code World Workshopの公式サイト https://codewf.com にアクセスして、さらに便利なツールをご覧ください。Code World WorkshopのソースコードもGitHubで公開していますので、ぜひフォローしてコントリビュートをお願いします。
皆様のご支援に感謝します。皆様の応援と励ましが私の原動力です。ご質問やご提案があれば、いつでもお気軽にご連絡ください。一緒に素晴らしいCode World Workshopを作りましょう!