Skip to content

Instantly share code, notes, and snippets.

@jakubfijalkowski
Created May 10, 2015 15:22
Show Gist options
  • Save jakubfijalkowski/0771bfbd26ce68456d3e to your computer and use it in GitHub Desktop.
Save jakubfijalkowski/0771bfbd26ce68456d3e to your computer and use it in GitHub Desktop.
WPF l10n with bindings
using System.ComponentModel;
using System.Globalization;
using System.Resources;
using System.Windows.Data;
public class TranslationSource
: INotifyPropertyChanged
{
private static readonly TranslationSource instance = new TranslationSource();
public static TranslationSource Instance
{
get { return instance; }
}
private readonly ResourceManager resManager = Properties.Resources.ResourceManager;
private CultureInfo currentCulture = null;
public string this[string key]
{
get { return this.resManager.GetString(key, this.currentCulture); }
}
public CultureInfo CurrentCulture
{
get { return this.currentCulture; }
set
{
if (this.currentCulture != value)
{
this.currentCulture = value;
var @event = this.PropertyChanged;
if (@event != null)
{
@event.Invoke(this, new PropertyChangedEventArgs(string.Empty));
}
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class LocExtension
: Binding
{
public LocExtension(string name)
: base("[" + name + "]")
{
this.Mode = BindingMode.OneWay;
this.Source = TranslationSource.Instance;
}
}
@mhdb96
Copy link

mhdb96 commented Aug 12, 2020

Works like a charm!! Thanks man.

@MarcinSzolke
Copy link

MarcinSzolke commented Aug 12, 2020

everything (property binding) works but it is (da vinci code = to run You must replace one element : ) ) ...
VIEW:

  1. xmlns:local="clr-namespace:MyNamespace.UserInterface.Common.Localization"
  2. <TextBlock Text="{local:LocK name}"/>
  3. the Resource files in the code above default are placed in the PROPERTIES folder(but You can adjust the ResourceManager
    properties
    ):

@nevaran
Copy link

nevaran commented Nov 23, 2020

Since I had a bit of trouble figuring out how to actually use the class, heres examples to help others:

XAML:
xmlns:local="clr-namespace:MyNamespace.LocalizationNamespace"
The namespace for xaml is whatever you set it in the class.

Usage:
"{local:Loc <PropertyName>}"

C#:
Properties.Resources.ResourceManager.GetString(nameof(Properties.Resources.<PROPERTYNAME>), Localization.TranslationSource.Instance.CurrentCulture);

And for switching to the actual culture:
C#:
Localization.TranslationSource.Instance.CurrentCulture = CultureInfo.GetCultureInfo("en-example");

@jakubfijalkowski
Copy link
Author

@nevaran - you can check the blog post that I wrote about this. It explains how it works a little bit better (although it might not be fully explanatory).

@nevaran
Copy link

nevaran commented Nov 23, 2020 via email

@lszczygielek
Copy link

@jakubfijalkowski, thanks for your code. Is there a way to allow something like this?
{ns:Loc {Binding ViewModelProperty}}

@jakubfijalkowski
Copy link
Author

@lszczygielek If my memory is not mistaken, that is possible with some changes to the code (i.e. you need to handle the binding somewhat yourself). Unfortunately, I haven't touched it in years and won't be able to help what needs to be changed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment