Skip to content

Instantly share code, notes, and snippets.

@maxfridbe
Created January 23, 2013 21:26

Revisions

  1. maxfridbe created this gist Jan 23, 2013.
    84 changes: 84 additions & 0 deletions wpflanguageswitch.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    In code:
    <Button
    Content="{DynamicResource Previous}"
    Command="{Binding PrevView}" Grid.Column="0"/>

    <Window.Resources>
    <ResourceDictionary>
    <!--<Selectors:ViewSelector x:Key="ViewSelector">
    </Selectors:ViewSelector>-->
    <ResourceDictionary.MergedDictionaries>
    <local:ResourceDictionaryLocator Assembly="{x:Type Windows:MainWindowStudioFlow}"/>
    </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    </Window.Resources>

    public class ResourceDictionaryLocator : ResourceDictionary
    {
    private Type _assembly ;
    public Type Assembly
    {
    set
    {
    _assembly = value;
    updateSrc();
    }
    }
    public ResourceDictionaryLocator()
    {
    ModuleBootstrapper.LanguageChanged += (s) => updateSrc();
    }

    private void updateSrc()
    {
    var uriSRC = ModuleBootstrapper.GetCurrentUICultureSource("StringResources", _assembly);
    base.Source = uriSRC;
    }

    }
    public static class ModuleBootstrapper
    {
    public static Uri GetCurrentUICultureSource(string resourceName, Type containingModule)
    {

    var name = containingModule.Assembly.GetName().Name;
    var cult = Thread.CurrentThread.CurrentUICulture.ToString();

    var location = cult == "en-US"
    ? string.Format("pack://application:,,,/{0};component/Resources/{1}.xaml", name, resourceName)
    : string.Format("pack://application:,,,/{0};component/Resources/{1}.{2}.xaml", name, resourceName, cult);
    var uri = new Uri(location, UriKind.RelativeOrAbsolute);
    return uri;
    }

    public static ResourceDictionary GetCurrentUICultureResourceDictionary(string resourceName, Type containingModule)
    {
    var dict = new ResourceDictionary();

    var uri = GetCurrentUICultureSource(resourceName, containingModule);
    dict.Source = uri;
    return dict;
    }
    public static void LoadCulturalDictionary(Collection<ResourceDictionary> mergedDictionaries, string stringresources, Type getType)
    {
    var name = CultureInfo.CurrentUICulture.Name;
    if (name != "en-US")
    {
    var existing = mergedDictionaries.FirstOrDefault(rd => rd.Source.OriginalString.Contains(stringresources));
    if (existing != null)
    mergedDictionaries.Remove(existing);

    var dict = ModuleBootstrapper.GetCurrentUICultureResourceDictionary(stringresources, getType);
    mergedDictionaries.Add(dict);
    }
    }

    public static void ChangeLanguage(string code)
    {
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(code);
    if(LanguageChanged != null)
    LanguageChanged(code);
    }

    public static event Action<string> LanguageChanged;
    }