在Silverlight中使用嵌入式资源(4) - 其他文化未编译

时间:2010-06-09 13:31:26

标签: silverlight localization resources silverlight-4.0 embedded-resource

我在一个小型Silverlight 4应用程序中为UI提供本地化字符串有点困难。基本上我放了一个文件夹“Resources”并在其中放置了两个资源文件:

Statuses.resx
Statuses.ro.resx

我有枚举状态:

public enum Statuses
{
    None,
    Working
}

和转换器:

public class StatusToMessage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!Enum.IsDefined(typeof(Status), value))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        var x = Statuses.None;
        return Statuses.ResourceManager.GetString(((Status)value).ToString(), Thread.CurrentThread.CurrentUICulture);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在视图中我有一个文本块:

    <TextBlock Grid.Column="3" Text="{Binding Status, Converter={StaticResource StatusToMessage}}" />

在视图渲染时调用转换器,但无论Thread.CurrentThread.CurrentUICulture设置了什么,它总是返回默认的文化值。

进一步检查后,我拆开了XAP结果文件,将生成的DLL文件带到Reflector并检查了嵌入的资源。它只包含默认资源!!

回到我正在检查其属性的两个资源文件:

构建操作:嵌入式资源 复制到输出目录:不要复制 自定义工具:ResXFileCodeGenerator 自定义工具命名空间:[empty]

两个资源(.resx)文件都具有这些设置。 .Designer.cs结果文件如下:

Statuses.Designer.cs:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace SilverlightApplication5.Resources {
    using System;


    /// <summary>
    ///   A strongly-typed resource class, for looking up localized strings, etc.
    /// </summary>
    // This class was auto-generated by the StronglyTypedResourceBuilder
    // class via a tool like ResGen or Visual Studio.
    // To add or remove a member, edit your .ResX file then rerun ResGen
    // with the /str option, or rebuild your VS project.
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    internal class Statuses {

// ... yadda-yadda

Statuses.ro.Designer.cs

[空]

我已经将两个文件都放在一个控制台应用程序中,它们的行为与预期一致,而不像在这个Silverlight应用程序中那样。

有什么问题?

1 个答案:

答案 0 :(得分:6)

事实证明你只需再做一件小事了。正如MSDN article所说:

  

在“解决方案资源管理器”中,右键单击   项目名称,然后单击“卸载”   项目关闭项目的同时   让项目图标可见。

     

在“解决方案资源管理器”中,右键单击   单击项目名称,然后单击编辑。

     

项目文件在Visual中打开   Studio XML Editor。

     

在项目文件中,添加名称   区域中立和具体   卫星组件的文化   您的应用程序已创建到   &LT;的 SupportedCultures &GT;标签。如果你的   应用支持多个   文化,使用分号(;)   分开他们的名字。这份清单   文化不应该包括你的   应用程序的默认文化。对于   例如,&lt; SupportedCultures &gt;标签   一个默认文化的应用程序   是英语(“en”)并且支持   英语 - 美国(“en-US”),   法语(“fr”),法语 - 法国   (“fr-FR”),俄语(“ru”)和俄语    - 俄罗斯(“ru-RU”)文化可能如下所示:

     

<SupportedCultures>en-US;fr;fr-FR;ru;ru-RU;</SupportedCultures>

所以,记得f!@#ingly手动编辑项目文件并指定要包含在编译中的文化。

现在它正在起作用:D