Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails应用程序逻辑国际化_Ruby On Rails_Internationalization - Fatal编程技术网

Ruby on rails Rails应用程序逻辑国际化

Ruby on rails Rails应用程序逻辑国际化,ruby-on-rails,internationalization,Ruby On Rails,Internationalization,我正在开发一个rails应用程序,它将在不同的国家运行不同的实例。国际化处理语言问题,但当有一些小的逻辑变化时,我不确定如何处理。一个例子是支付方式——在每个国家,将向具有不同集成的用户显示不同的选项。另一个例子是薪俸税和社会保障在不同的国家是完全不同的,所以我们需要考虑到这一点 差别并不是很多,所以一般来说,我不想为每个国家创建不同的git分支,但我可能错了 我目前考虑的解决方案是为每个国家提供一个不同的环境——“生产德国”、“生产法国”等,并根据这一点加载一个不同的yml文件,其中包含我需要

我正在开发一个rails应用程序,它将在不同的国家运行不同的实例。国际化处理语言问题,但当有一些小的逻辑变化时,我不确定如何处理。一个例子是支付方式——在每个国家,将向具有不同集成的用户显示不同的选项。另一个例子是薪俸税和社会保障在不同的国家是完全不同的,所以我们需要考虑到这一点

差别并不是很多,所以一般来说,我不想为每个国家创建不同的git分支,但我可能错了

我目前考虑的解决方案是为每个国家提供一个不同的环境——“生产德国”、“生产法国”等,并根据这一点加载一个不同的yml文件,其中包含我需要的这个国家的所有必要变量。然后创建一些“Manager”类,该类将决定要加载哪些特殊类以及要在视图上显示哪些内容(只要存在差异)。例如,我可以在“salary_calculation/de”中为德国设置薪资计算类,在“salary_calculation/fr”中为法国设置薪资计算类,并仅加载我需要的薪资计算类


你的解决方案是什么

我会尽可能多地使用Rails'
I18n
处理。如果你还没有,也看看

对于不由Rails处理的特殊情况,我会像Rails本身一样进行处理。例如,在您的
配置/locales
中,您可能有一些国家/地区的税收配置:

en:
  taxes:
    name: Tax
    rate: 0.065
de:
  taxes:
    name: USt
    rate: 0.19
然后编写一个
TaxesHelper
模块,该模块将使用区域设置文件中的信息显示税率。看看Rails包

如果你真的用税率之类的东西进行计算,我会在你进行计算的模型中保留这个因子。这样,当税率改变时,你的计算就不会混乱。假设您有以下型号:

class Invoice < ActiveRecord::Base
  # Injected by AR
  # attr_accessor :net_price
  # attr_accessor :tax_rate
  def gross_price
    net_price * tax_rate
  end

  before_create do
    tax_rate = I18n.t(:rate, scope: [ :taxes ]).to_f
  end
end
class发票

这样,在特定国家的税率发生变化后,持久发票的总价格不会发生变化。

Amiuhle就如何处理静态参数化提供了一个很好的建议-语言、税率等

当您需要更多的业务逻辑时,事情就会变得更复杂,并且没有一刀切的解决方案,只需确保了解您可以使用的工具,并确保您适合合适的工具,下面还有一个在ruby社区中似乎没有得到充分利用的工具:

依赖注入 例如:

例如,此模式通常适用于管理支付提供商网关

class Transaction < ActiveRecord::Base
  def gateway_class
    I18n.t(:class_name, scope: [ :payment_provider ]).constantize
  end
  def gateway
    @gateway ||= gateway_class.new(self)
  end
end
并且您确保支付提供商类响应相同的公共API,因此对于整个应用程序,不必知道使用了哪个支付提供商,只需连接一个支付提供商类即可

另一件好事是,您可以创建一个用于测试和开发的
FakePaymentProvider
类,这将大大加快您的测试速度-即使您通常会使用诸如
vcr
之类的web模拟工具,您仍然可以使用类似
vcr
的工具来测试集成,而只是测试集成,与应用程序体系结构的其余部分分离


事实上,看看这里:有人已经为这个计划做了大量工作:)

在我回答之前,有一个问题,不同的国家真的需要共享数据吗?你真的期望国家之间有多大的差异?如果没有,那么您可以使用不同的数据库,如果没有,那么您可以将应用程序构造为多租户应用程序(google表示“多租户rails应用程序”),告诉我更多信息,我会给您写更多信息:)嘿,谢谢您的提问。这与数据库无关,应用程序将位于不同的服务器上,它们不需要共享数据。但根据法规和一些本地设置,应用程序中的某些逻辑需要在不同国家进行更改。如何以干净的方式做到这一点是一个问题?
payment\u provider
vs
payment\u providers
in ruby vs yaml。无法编辑,因为它必须至少包含6个字符…谢谢,依赖项注入似乎非常相关!但是,可能将其放在区域设置中不是一个很好的选择,因为它将取决于用户选择的语言:在每个网站运行的国家,它都有母语和英语翻译。我认为更好的解决方案是将所有特定于位置的设置存储在单独的文件中,如“france.yml”。我还没有弄清楚如何启动rails服务器并告诉它从“france.yml”而不是“germany.yml”加载设置,例如.Kazmin,假设它们都运行不同的主机,您需要一个env变量来告诉系统要运行什么配置,只是要确保这是正确的方法。谢谢!。不过我想澄清一些事情,因为我不能100%确定什么是正确的方法。在英国,税率将为0.065,并将存储在en语言环境中。如果我想让网站有一个德语翻译怎么办?如果用户正在查看英国网站的德语翻译,我不想使用0.19税率。所以我可能会创建一个新的“en de”语言环境,用于英国网站的德语翻译。但我会重复90%的“de”和“en-de”语言环境之间的翻译。如何避免呢?我想在这种情况下,它不再是真正的i18n了。方法是相同的,只是使用自定义配置,而不是“滥用”Rails的i18n。另外,在您的例子中,“de”和“en”实际上是不够的,因为您需要的是国家配置,而不是语言配置。
en:
  payment_provider:
    class_name: PaymentProvider
de:
  payment_provider:
    class_name: AnotherPaymentProvider