碼坊「文章標題URL別名生成器」上線

碼坊「文章標題URL別名生成器」上線

碼坊是站長新開的一個提供網頁在線工具、跨平台桌面和手機應用的開源專案。站長將終致力於為你帶來更高效、更便捷的使用體驗。今天,站長榮幸地推出「文章標題URL別名生成器」,幫助你輕鬆創建文章標題的URL別名,提升SEO效果和用戶體驗。快來碼坊,探索更多實用工具吧!

最後更新 2024/1/7 上午12:12
沙漠尽头的狼
預計閱讀 5 分鐘
分類
Blazor
標籤
.NET Blazor Avalonia UI 開源專案 開源

大家好,我是沙漠盡頭的狼。今天,我要向大家介紹一個非常實用的工具,碼坊。

碼坊是站長新開發的一個開源專案,提供網頁線上工具,同時提供跨平台桌面和手機 App 版本。我們的目標是為你帶來更高效、更便捷的線上工具使用體驗。今天,我非常榮幸地推出「文章標題 URL 別名產生器」,這個工具可以幫助你輕鬆建立文章標題的 URL 別名,提升 SEO 效果和用戶體驗。

這是什麼工具?

你是否曾經遇過這樣的問題:你寫了一篇很好的文章,卻因為標題過長或包含特殊字元而導致 URL 看起來不美觀,甚至影響 SEO 效果?現在,有了「文章標題 URL 別名產生器」,這些問題都將得到解決。

這個工具提供了三大功能:

  1. 中英互譯:將中文標題翻譯成英文,或將英文標題翻譯成中文。
  2. 英文轉 URL 別名:將英文標題轉換為簡潔的 URL 別名,方便在網站上使用。
  3. 中文轉 URL 別名:將中文標題轉換為簡潔的 URL 別名,方便在網站上使用。

特別適合文章取好中文標題後,需要在網站發佈取文章存取連結生成使用。比如將本文標題《码坊“文章标题URL别名生成器”上线》在工具中轉換為code-world-workshop-article-title-url-alias-generator-launched,轉換效果如下:

標題別名轉換演示

使用該工具在Dotnet9網站發佈後,在網站上的存取位址是https://dotnet9.com/2024/01/code-world-workshop-article-title-url-alias-generator-launched

中英互譯、別名轉換實現

這個工具的實現原理很簡單。我們使用了GTranslate套件的YandexTranslator類別來進行中英互譯,因為它使用了神經網路機器翻譯技術,可以提供更高品質的翻譯結果。對於 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開發,待功能開發到一定程度,站長會介紹工具框架的搭建,下面是工具效果圖:

工具效果圖

工具效果圖

如果你對這個工具感興趣,可以造訪碼坊官網 https://codewf.com,查看更多實用工具。碼坊的原始碼也在GitHub開源,歡迎大家關注和貢獻。

感謝大家的支持,是你們的支持和鼓勵讓我不斷前進。如果你有任何問題或建議,歡迎隨時聯繫我們。讓我們一起打造更美好的碼坊!

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2024/2/29

Winform中也可以這樣做資料展示

在做winform開發的過程中,經常需要做資料展示的功能,之前一直使用的是gridcontrol控制項,今天想透過一個範例,跟大家介紹一下如何在winform blazor hybrid中使用ant design blazor中的table元件做資料展示。

繼續閱讀
同分類 / 同標籤 2024/2/29

Winform的介面也可以變好看?

前幾天跟大家介紹了在winform中使用blazor hybrid,而且還說配上blazor的UI可以讓我們的winform程式設計的更加好看,接下來我想以一個在winform blazor hybrid中繪圖的範例來進行說明,希望對你有所幫助。

繼續閱讀