From beebaf7b68b3749f4a1bc4d916e23906b8c16d7f Mon Sep 17 00:00:00 2001
From: Ariver <ar@MacBook-Air.local>
Date: Wed, 13 May 2026 23:31:23 +0800
Subject: [PATCH] Release TagLauncher 5.6.0

---
 Apptag/L10n.swift |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/Apptag/L10n.swift b/Apptag/L10n.swift
index 9d6ac8b..d2d3612 100644
--- a/Apptag/L10n.swift
+++ b/Apptag/L10n.swift
@@ -2,6 +2,10 @@
 
 // MARK: - Localization Manager
 
+extension Notification.Name {
+    static let appLanguageDidChange = Notification.Name("AppLanguageDidChange")
+}
+
 enum L10n {
     static var current: [String: String] = [:]
     private(set) static var currentCode = "en"
@@ -25,8 +29,23 @@
     ]
 
     static func switchTo(_ code: String) {
+        guard supported.contains(where: { $0.code == code }) else { return }
+        guard code != currentCode else { return }
         load(code)
         UserDefaults.standard.set(code, forKey: "appLanguage")
+        NotificationCenter.default.post(name: .appLanguageDidChange, object: nil, userInfo: ["code": currentCode])
+    }
+
+    /// Load a specific key's translation for a given language code without switching.
+    static func loadedTranslation(_ key: String, for code: String) -> String? {
+        guard let url = Bundle.main.url(
+            forResource: code, withExtension: "json",
+            subdirectory: "Localization"
+        ) else { return nil }
+        guard let data = try? Data(contentsOf: url),
+              let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String]
+        else { return nil }
+        return dict[key]
     }
 
     private static func load(_ code: String) {

--
Gitblit v1.9.3