【问题标题】:Using SQL for localization instead of RESX files in ASP.NET在 ASP.NET 中使用 SQL 而非 RESX 文件进行本地化
【发布时间】:2010-04-11 17:02:14
【问题描述】:

我正在考虑开发以下内容,但想知道它是否已经存在:

我需要一个基于 SQL 的解决方案来分配和管理 asp.net 站点的本地化文本值,而不是使用 RESX 文件。这有助于维护网站上的文本,而无需在需要更新时将其删除以进行部署。

谢谢。

【问题讨论】:

  • 我听说当您放入新的 resx 时网站会重新启动
  • 我想知道你当时的结论是什么,因为我今天也有类似的情况。

标签: asp.net sql resx


【解决方案1】:

我们实际上是沿着这条路走的,最终得到了一个非常慢的网站——去掉了基于 SQL 的翻译机制并使用 ASP.NET 资源给了我们显着的性能提升。所以我真的不能推荐你做同样的事情......(是的 - 我们正在缓存和优化吞吐量和一切 - 基于 SQL 的东西仍然明显慢)。

物有所值 - 基于 SQL 的方法在能够即时“翻译”和修正拼写错误等方面更加灵活。但最终,在我们的应用程序(当时的 Webforms,.NET 2.0)中,使用资源被证明是唯一可行的方法。

【讨论】:

  • 在我构建的一个应用程序中,我们正在考虑走这条将资源移动到数据库中的道路。我一直想知道这样做的性能(我知道会有一个)。
  • 我完全不同意。翻译数据很容易缓存,而且如果解决方案执行得很好,性能应该不是问题!
  • @Robert:你可以不同意——我只能谈谈我们的经验。我们也做了一些非常激进的缓存——甚至从未获得与 RESX 相媲美的性能。这就是我们的故事。
  • @Marc_s:我完全相信你的经验,但也许问题在于实施,而不是一般概念?
  • @Robert:也许——我不知道——我只是想警告一下,它可能不像最初看起来那么容易,至少要让它以良好的性能启动并运行跨度>
【解决方案2】:

我们这样做了(基于 SQL 的翻译),我们对结果非常满意!我们为翻译机构开发了一个界面来在线更新页面。作为一个副作用,该解决方案开始充当内容管理系统。如果您缓存数据,则性能不是问题。不利的一面是,我们在解决方案上投入了数百个小时。 (我猜……大约 600 小时,但我可以检查一下。)。

【讨论】:

  • @Robert,这就是我的想象。我的网站非常大,并且越来越难以进行最小的更新,例如文本、简单样式、显示/隐藏元素、管理网站菜单......等等我让我的团队通过构建基于 SQL 的小型管理系统来处理每一个问题最终将添加到站点范围的 CMS。我沿着这条路走的两个主要问题是:1-数据库负载2-管理本地开发环境和love环境之间的文本和配置你能告诉我更多关于你的项目、范围、负载、大小......等的信息吗?谢谢。
  • 我们每天最多有 20 000 名访问者和 200 名并发活跃用户。我们在 ASP.NET 缓存中缓存所有翻译。 SQL-Load 这样就没有问题了。当有人编辑翻译时,缓存会失效并从数据库中重新填充。 (我不确定是否在此处进行任何分段。)我们将翻译存储在 3 个表中。 “Translaiton”、“TranslationGroup”、“TranslaionValue”。我们目前有 48738 个 TranslationValues(大约 25 种语言),用于 230 个组中的 2427 个要翻译的项目(单个页面是组或按主题的占位符以这种方式连接)。
  • 我们考虑开源我们的解决方案,但没有找到时间这样做。
  • 感谢罗伯特提供的详细信息。这真的很有帮助。现在,我的下一个问题是如何最好地使用数据库中的文本填充页面上的标签和其他控件?我最初的想法是尝试覆盖 .Net 处理资源文件的方式,只更改数据源。即这样我仍然可以使用 "..meta:resourceKey = "".... 在将资源分配给控件时。我很想知道您在这部分中使用了什么方法。谢谢。
  • “我们考虑开源我们的解决方案,但没有找到时间这样做”您好 Robert - 我也对您的解决方案非常感兴趣。在负载方面,200 个并发活跃用户对我们来说将是梦想成真。是否有可能从系统的核心工作中获得一些代码示例?数据库设计听起来很简单。我对您如何将每个“字符串占位符”集成到您的内容中更感兴趣。例如,您是否按名称引用每个定义?按号码?通过枚举?等希望这是有道理的。在此先感谢您。
【解决方案3】:

我们最终得到了一个混合解决方案,用户可以将内容编辑到数据库中,但应用程序随后会创建一个手动部署的 .resx。

你也可以完全绕过服务器翻译,在客户端用jQuery进行翻译,这是我成功使用的一种方法。

【讨论】:

    【解决方案4】:

    我不确定网站重启,但至少使用.NET MVC非常方便,我没有注意到重启问题,如果发生,你需要多久更新一次resx文件?对于较大的项目,我使用多个项目创建解决方案,其中一个用于本地化,如下所示:

    • MyApp.Localization
      • 型号
      • 页面
      • File1.resx
    • MyApp.Core
    • MyApp.Web

    然后在 Web 项目中添加对 Localization 项目的引用,并像使用它一样

    @MyApp.Localization.Model.Customer.CustomerName

    @MyApp.Localization.Page.About.PageTitle

    @MyApp.Localization.File1.Paragraph1

    每次更改翻译文本时,我都会上传更新的 .dll 或复制 .resx 文件。

    注意:您需要将 resx 文件设置为 PUBLIC,以便可以作为强类型访问。

    【讨论】:

      【解决方案5】:

      我创建了一个基于 SQL 的翻译方案。但是我只在请求时加载给定页面所需的翻译,并且只加载该特定页面的翻译。

      当页面在会话期间重新加载和缓存时,它们会被加载到字典对象中。然后只是根据查找进行文本替换。

      几乎所有内容都是动态生成的,并且包括必须翻译的用户定义内容,因此灵活性是关键。

      性能相当快,检索所有数据的 SQL 查询需要更长的时间(相对而言)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多