程式裡要算陰曆日期、查沖煞、找哪天宜嫁娶好開工,找現成程式庫是最簡便的做法。Github 有上有個開源程式庫作者 - 6tail,一口氣提供了 C#、Flutter、Go、JavaScript、PHP、Python、Swift、TypeScript 等八種無第三方依賴程式庫(完全以該語言實作,不依賴其他程式寫的程式庫),除了基本的計算日期天干地支節氣,連吉凶沖煞宜忌都有,還是採最寬鬆的 MIT 開源授權(延伸閱讀:開源授權常識補充包(2024 版),使用自由並可商用,真是佛心來著,當場奉上一顆星星:

但美中不足的是,雖然程式庫從 NuGet 就能下載,但原程式庫只支援簡體中文。趁著月底 Github Copilot 點數沒用完,就順手用 AI 協作,讓它支援繁體中文。

最粗暴無腦的做法是 Fork 一份,把其中的簡體中文翻譯成繁體重新編譯;但如此新版程式與源頭就脫鉤了,未來原作者若改了程式,你就得重新把更新合併進來。我的構想是把繁簡文字不同部分抽取成獨立類別,允許加上不同語言的實做。

正統做法應該是抽取提供文字串屬性的 Interface,每個語言實作一份類別、或是使用 .NET 資源檔。我是 KISS 原則的信徒,選擇了更精簡的做法,將簡體文字字串的部分提取到 TextResource 類別,屬性部分設 virtual,然後新增一個 TextResourceCht 類別繼承 TextResource,override 提供文字資料的屬性改成繁體中文內容,如此可對專案架構的改動不大,但又足以應付未來的擴充需求。

原本程式都用是 static 屬性或 Field 提供字串資料,為了支援抽換需要改從 Instance 提供,我的改寫方式是維持原本的 static 宣告方式,但低層改成由 Instance 取值,例如:public static readonly string[] XING_ZUO = { "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯", "水瓶", "双鱼" }; 改成 public static string[] XING_ZUO => TextResource.Instance.XING_ZUO;。至於 TextResource.Instance 則由當前 CultureInfo.CurrentCulture.Name 決定,若為 zh-TW 時切換成繁體中文,其餘一律使用原本的簡體中文內容,另外再提供 SwitchToCulture() 強制切換:

    /// <summary>
    /// 文本资源
    /// </summary>
    public class TextResource
    {
        /// <summary>
        /// 文本资源实例,根据当前文化信息初始化
        /// </summary>
        public static TextResource Instance =
            CultureInfo.CurrentCulture.Name == "zh-TW" ? new TextResourceBaseCht() : new TextResource();

        /// <summary>
        /// 依據語系代碼切換文字顯示,目前只新增支援 zh-TW,其餘語系一律使用簡體中文
        /// </summary>
        /// <param name="cultureName"></param>
        public static void SwitchToCulture(string cultureName)
        {
            if (cultureName == "zh-TW")
            {
                Instance = new TextResourceBaseCht();
            }
            else
            {
                Instance = new TextResource();
            }
        }
    // ... 略 ...

對實作細節有興趣的同學請直接參考 Commit

經簡單實測,這樣子 lunar-csharp 就可支援繁體中文了!

現階段大家若想用,可 Clone Github 專案自己 Build lunar.dll 使用,發現問題歡迎發 Issue,我打算測試觀察一段時間後,發 PR 看有沒有機會併入 6tail 的專案,未來大家從 NuGet 下載的版本就能支援繁體中文囉~

【關於宜忌差異】

實測發現程式庫及網路農民曆算出的每日宜忌跟我手邊的紙本不同,例如:2/25 的宜忌嫁娶是相反的。稍稍研究了一下,宜忌的門派很多,也常見甲本農民曆提到某日適宜「安香」,但是另一本有可能寫著「忌安香」,此本言吉,它本言凶,但這段遠超開發人員或一般人能掌握的範圍,該如何處理留給大家自行拿捏囉~

Explains extending the open‑source lunar-csharp library to support Traditional Chinese using an AI-assisted, KISS-friendly design. Details a minimal localization approach, tradeoffs versus forking, and notes real-world differences in lunar calendar auspices.


Comments

Be the first to post a comment

Post a comment