// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System.Text.RegularExpressions; using Squidex.Translator.State; namespace Squidex.Translator.Processes; public class CheckFrontend(DirectoryInfo folder, TranslationService service) { private readonly DirectoryInfo folder = Frontend.GetFolder(folder); public void Run(bool fix) { var all = new HashSet(); foreach (var (file, relativeName) in Frontend.GetTemplateFiles(folder)) { var translations = GetTranslationsInTemplate(file); foreach (var translation in translations) { all.Add(translation); } var notTranslated = Helper.CheckForFile(service, relativeName, translations); if (fix) { foreach (var key in notTranslated) { service.Add(key); } } } foreach (var (file, relativeName) in Frontend.GetTypescriptFiles(folder)) { var translations = GetTranslationsInTypescript(file); foreach (var translation in translations) { all.Add(translation); } var notTranslated = Helper.CheckForFile(service, relativeName, translations); if (fix) { foreach (var key in notTranslated) { service.Add(key); } } } var notUsed = Helper.CheckUnused(service, all); if (fix) { foreach (var key in notUsed) { service.Remove(key); } } Helper.CheckOtherLocales(service); service.Save(); } private static HashSet GetTranslationsInTemplate(FileInfo file) { var content = File.ReadAllText(file.FullName); var translations = new HashSet(); void AddTranslations(string regex) { var matches = Regex.Matches(content, regex, RegexOptions.Singleline | RegexOptions.ExplicitCapture); foreach (Match match in matches.OfType()) { translations.Add(match.Groups["Key"].Value); } } AddTranslations("\"i18n\\:(?[^\"]+)\""); AddTranslations("\'i18n\\:(?[^\']+)\'"); AddTranslations("\"(?[^\"]+)\"[\\s]*\\|[\\s]*sqxTranslate"); AddTranslations("\'(?[^\']+)\'[\\s]*\\|[\\s]*sqxTranslate"); return translations; } private static HashSet GetTranslationsInTypescript(FileInfo file) { var content = File.ReadAllText(file.FullName); var translations = new HashSet(); void AddTranslations(string regex) { var matches = Regex.Matches(content, regex, RegexOptions.Singleline | RegexOptions.ExplicitCapture); foreach (Match match in matches.OfType()) { translations.Add(match.Groups["Key"].Value); } } AddTranslations("'i18n\\:(?[^\']+)'"); AddTranslations("localizer.get\\('(?[^\']+)'\\)"); AddTranslations("localizer.getOrKey\\('(?[^\']+)'\\)"); return translations; } }