语言文件的单独文件夹

时间:2011-02-01 16:12:47

标签: c# localization

我正在尝试创建一个多语言应用程序。我为每种语言使用单独的资源文件,如:

app.nl-NL.resx  
app.en-GB.resx  

但是当我编译时,它将使用编译的资源文件为每个资源文件创建子目录。

示例:

app\bin\Debug\nl-NL\app.resources.dll  
app\bin\Debug\en-GB\app.resources.dll  

如何将它全部放在单独的目录中,例如_app \ bin \ Debug \ Lang \ nl-NL_?

2 个答案:

答案 0 :(得分:4)

您可以将它们全部放入单独的文件夹中。 这是类似的question with solution。 我虽然有这个问题,这就是我解决它的方法: 首先,您需要将“Lang”文件夹添加到程序将搜索本地化资源的文件夹列表中。 为此,您应该将这些行添加到项目的.config文件中:

<configuration>
...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Lang"/>
    </assemblyBinding>
  </runtime>
</configuration>

info about probing element on msdn

然后,在重建之后,您可以手动将生成的“xx-YY \ app.resources.dll”文件夹移动到Lang文件夹,或者您可以将小脚本添加到Post-build事件命令行,以自动移动它们。 我用过这样的命令:

robocopy $(TargetDir) $(TargetDir)\Lang "$(TargetName).resources.dll" /CREATE /S /XD Lang /IS /IT 
robocopy $(TargetDir) $(TargetDir)\Lang "$(TargetName).resources.dll" /MOVE /S /XD Lang /XL /IS /IT

但请注意,robocopy的返回码1是正常行为,而visual studio将认为它是一个错误。因此,如果您在构建后使用任何其他命令,只需将robocopy放在它们之前。 或者按照建议here检查%errorlevel%。

也许,有一个更好的解决方案,但它适合我。

答案 1 :(得分:2)

如果您希望本地化工作,您应该保留卫星程序集。

这就是它们的工作方式,根据目录名称查找资源。

请参阅this MSDN页面(创建附属组件)上的“全局程序集缓存中未安装的卫星程序集的目录位置”部分。