使用支持本地化的语言键构建 C# 应用程序

彼得罗克

介绍

我正在寻找更多定制的解决方案来翻译我的应用程序。我将获得条目使用Humanizer问题是首先定义密钥以获取它们。Smart.Format

要求

要求是:

  1. 语言键必须在代码中定义,最好靠近使用它们的地方
  2. 语言键必须包含默认英语值
  3. 构建应用程序套件后,必须列出所有语言键(XML、CSV、JSON 等)
  4. 语言条目必须从外部源(如 JSON 文件)提供,无需任何类型的重新编译
  5. 该应用程序可能包含多个可执行文件、共享库等。所有这些都采用 C# 应用程序的形式

废弃溶液

首先,我丢弃的东西:

  • 内置C#Resources.dll;他们违反了(1)和(4)
  • 带有密钥的外部文件。违规 (1)

我处理问题的想法

现在,我对解决方案的想法看起来是这样(并且受到 C++ 的启发GetText

有一个包含键的模板类:

private sealed class Module1Keys : LocalizationKeys<Module1Keys>
{
    public static readonly LocalizationKey HelloWorld = DefineKey("/foo", "Hello World!");
    public static readonly LocalizationKey HelloWorld2 = DefineKey("/bar", "Hello World2!");
}

并且类 LocalizationKeys 包含一个静态方法,该方法实际上将在简单集合中注册键

public abstract class LocalizationKeys<T> where T : LocalizationKeys<T>
{
    protected static LocalizationKey DefineKey(string path, string english)
    {
        var ret = new LocalizationKey(typeof(T), path, english);
        // Following registers localization key in runtime:
        Localization.Instance.RegisterLocalizableKey(ret);

        return ret;
    }
}

问题

剩下来处理这一做法事是名单本地化键生成过程中...这是我在那里打在了墙上在运行时列出它们很容易,但我不能构建时运行代码(特别是它可能被构建为共享库)。

也许我想太多了,有更好、更干净的解决方案 - 我不需要坚持使用这个解决方案,但谷歌搜索并没有产生更好的结果......

彼得罗克

搞定了。GetText次,我们不得不诉诸手动解析代码。

……但是现在,有了 CSharp,我们有了 Roslyn 和 CodeAnalysis API。

解决方案

连接自定义控制台构建工具,其中包括Microsoft.CodeAnalysisNuGet 并具有如下代码:

var model = compilation.GetSemanticModel(tree);
var methods = root.DescendantNodes().OfType<InvocationExpressionSyntax>();

foreach(var method in methods)
{
    if(model.GetSymbolInfo(method).Symbol is IMethodSymbol symbol &&
        symbol.ContainingNamespace.Name == "MyProject" &&
        symbol.ContainingType.Name == "LocalizationKeys" &&
        symbol.Name == "DefineKey")
    {
        var key = method.ArgumentList.Arguments.FirstOrDefault();
        var eng = method.ArgumentList.Arguments.Skip(1).FirstOrDefault();

        if(key.Expression is LiteralExpressionSyntax literalKey &&
            eng.Expression is LiteralExpressionSyntax literalEng)
        {
            // "/foo" -> "Hello World!"
            // "/bar" -> "Hello World2!"
            Console.WriteLine(literalKey + " -> " + literalEng);
        }
        else
        {
            // Bonus: detect violation of key definition rule. It is not a literal!
        }
    }
}

将此控制台工具编译为可执行文件并将其添加为构建后步骤。利润。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用libc.so.6捆绑C ++应用程序

Java应用程序的C语言?

示例应用程序以及使用C,C ++或Java的好处

使用CreateProcess从Win32 C ++应用程序启动Java应用程序时出错

在Go应用程序中使用C(++)以获得性能

如何使用pip处理python应用程序的C扩展?

从C#应用程序使用外接程序启动excel应用程序

使用CMake在C ++ android应用程序中使用libcurl

构建C ++应用程序(目录和文件夹)

Swift中的本地化-将应用程序限制为一种语言,即使该应用程序支持多种语言

Flutter:应用程序的语言环境不受其所有本地化委托的支持

Azure AD B2C支持的应用程序

使用MVC或C#.NET应用程序编辑Azure AD应用程序的requiredResourceAccess

容器化C#Winforms应用程序

如何构建和部署BPF BCC C ++应用程序?

使用C ++ 17构建ios应用程序?

如何混淆使用本地化扩展的C#wpf应用程序

在iOS应用程序中使用C ++库

如何在Windows应用商店应用中本地化通知和组合框?(C#/ XAML,多语言应用程序工具包)

iOS应用程序的本地化

如何从桌面C#应用程序使用Web服务?

如何使用混合静态和动态本地化文本的语言环境来本地化具有不同单词定位的node.js应用程序?

Web应用程序(.net C#)的可支持性

在Windows上使用Dev C ++编译Qt应用程序

C#使用桌面应用程序自动登录网站

运行从 C# 应用程序最小化的 Metro 应用程序

obj-c 应用程序未以编程方式本地化

本地化语言 Web 应用程序的自动化

创建本地化的 django 应用程序并使用其他应用程序的本地化