使用' Resx'进行c#本地化file,' ResourceManger-> GetString"功能总是考虑英语'文化

时间:2017-06-20 09:52:58

标签: c# .net xamarin localization xamarin.forms

我正在本地化Xamarin Forms项目。

我正在使用C#' Resx文件来实现它。

在我下载的Sample项目以及我创建的Demo项目中,一切正常。但是在我的实际项目中,AppResources.xyzKeyresourceManager.GetString(xyzKey, anyCulturePassed)都会返回英文Resx文件中的值。

我甚至尝试将硬编码的西班牙文化发送到resourceManager.GetString()函数。

const string ResourceId = "projectName.Resources.Resx.AppResources";

public static string Localize(string key, string comment)
{
    //var netLanguage = Locale ();

    // Platform-specific
    ResourceManager temp = new ResourceManager(ResourceId, typeof(L10n).GetTypeInfo().Assembly);
    Debug.WriteLine("Localize " + key);


    string result = "";
    try
    {
        //Dynamically detecting culture is commented for testing.
        //CultureInfo ci = DependencyService.Get<ILocale>().GetCurrentCultureInfo();

        CultureInfo ci = new CultureInfo("es");

        result = temp.GetString(key, ci);

        if (result == null)
        {
            result = key; // HACK: return the key, which GETS displayed to the user
        }
        return result;
    }
    catch (Exception e)
    {
        if (e != null)
        {

        }
    }
    return result;

}

尽管如此,总是从英文Resx文件中选择值。

这些是我的资源文件:

enter image description here

我确保通过打印来加载相应的资源文件;

    var assembly = typeof(AppResources).GetTypeInfo().Assembly;
        foreach (var res in assembly.GetManifestResourceNames()) 
        {
        System.Diagnostics.Debug.WriteLine("found resource: " + res);
        }

这是输出:

enter image description here

令人惊讶的是,在同一平台上,它在Sample和Demo项目中都能正常工作。

2 个答案:

答案 0 :(得分:1)

原来只有英文Resx文件被设置为Embedded Resource

因此,即使在打印GetManifestResourceNames()时,它也会打印Resx文件的名称,但它仅适用于该文件的英文版本。

要解决此问题,当您为新语言创建新XML个文件Resx时,

右键单击该文件 - &gt;构建行动 - &gt;设置为嵌入式资源。

答案 1 :(得分:0)

资源文件受执行线程文化的影响。您是否尝试更改正在运行的线程,例如;

newCulture = CultureInfo.CreateSpecificCulture("tr-TR");         
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;