【问题标题】:C# Key Value Default as KeyC# 键值默认为键
【发布时间】:2020-04-07 14:20:42
【问题描述】:

:)

我正在寻找几个月前在一个项目中看到的东西。我不知道他们使用什么,我很想知道它是如何工作的,但我不知道如何搜索它……我现在正在 6 个小时内寻找它……你能帮我吗提高我的知识? :D

数据库:

|id |key             |en          |fr           |
|1  |TheNameOfTheKey |Hello       |Bonjour      |
|2  |TheNameOfTheKey2|Hello2      |Bonjour2     |

代码:

String s1 = Singleton.Instance.Translation.TheNameOfTheKey
String s2 = Singleton.Instance.Translation.TheNameOfTheKey2

// this key don't exist in Db but return his name instead
String s3 = Singleton.Instance.Translation.AnotherKeyNotInDb 

// Results
// s1 = "Hello"
// s2 = "Hello2"
// s3 = "AnotherKeyNotInDb"

我的问题:

  1. 翻译的类型是什么?如果你有文档,我会看看!

  2. 看起来像我正在寻找的东西是:ExpandoObject

提前谢谢你!

【问题讨论】:

  • 这看起来像是某种全球化解决方案。你可能想搜索一下。
  • 1.如果数据库中没有键与查询匹配,则返回的代码中可能指定了一个默认值。 2. ExpandoObject 只是一个对象,其成员可以在运行时动态添加/删除/更改。我看不出它与你的问题有什么联系。
  • 我想你要找的是DynamicObject
  • 我已经在寻找 ASP 全球化,但它与我过去使用的不一样。我不知道这种语法.. MyObject.NameOfTheKey 返回值或他的名字
  • Singleton.Instance.Translation 可能是扩展 DynamicObject 并覆盖 TryGetMember() 并检查给定名称(在代码中您将其视为属性,但它实际上是在活页夹中传递给 TryGetMember()如binder.Name) 作为数据库中的键存在。如果键不存在,则返回键名。

标签: c# list translation key-value expandoobject


【解决方案1】:

您可以使用Resource file,它像字典一样工作,并且取决于您的本地化将加载适当的资源文件

stringsstrings.resx 文件

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

更多详情How to use Localization in C#

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1

【讨论】:

    【解决方案2】:

    如果要存储在数据库中,将语言保留为列是一个坏主意。我会将它们保留为行:

    |Id|Key             |Language|Translation|
    |1 |TheNameOfTheKey |en      |Hello      |
    |2 |TheNameOfTheKey |fr      |Bonjour    |
    

    索引键和语言列,您将获得非常快速的查询结果。这就是数据库的优势。 :)

    【讨论】:

    • 对于 sur,但是用一行键和值进行翻译更容易。我们可以轻松检查多个翻译之间的差异。而且我们需要更少的精力来比较多个翻译。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2011-08-06
    • 2015-01-10
    • 2016-04-25
    • 2014-11-15
    相关资源
    最近更新 更多