-
-
Save jakubfijalkowski/0771bfbd26ce68456d3e to your computer and use it in GitHub Desktop.
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; | |
} | |
} |
This is an excellent solution!
Thank you for this and for all your help making a version that works with multiple resource managers
Hi,
I am new to c# programming. I am trying to create a multi language app. I can't seem to get it to work. When i copy and paste the codes to project and created resources files. I keep getting error on this line
'private readonly ResourceManager resManager = Properties.Resources.ResourceManager;'
saying the name properties does not exist in current context.
as well
when I try to set the text on my textblook like
' < TextBlock Text="{x:Static ns:Loc t1}" Width="290" / > '
it will result in: Cannot find the member "Loc t1" on the target type.
Can someone help my learn please? thank you
Great solution!
tnx❤
@KaiserWerk: It doesn't really matter where it is, as long as you use correct ResourceManager
to get the strings (provided that it is being generated, i.e. the file has correct type in MSBuild). The common location is to put it in Resources
directory.
@KaiserWerk: It doesn't really matter where it is, as long as you use correct
ResourceManager
to get the strings (provided that it is being generated, i.e. the file has correct type in MSBuild). The common location is to put it inResources
directory.
I already got it working, google helped. Thanks a lot to you, too!
Unfortunately this method does not support binding to property,I found a better code that also supports binding
You can use the Handycontrols package to use it
github.com/ghost1372/handycontrols
Works like a charm!! Thanks man.
everything (property binding) works but it is (da vinci code = to run You must replace one element : ) ) ...
VIEW:
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, thanks for your code. Is there a way to allow something like this?
{ns:Loc {Binding ViewModelProperty}}
@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.
Wow, I didn't expect that much feedback here (and GitHub decided not to notify me - damn you, settings!). It's awesome that you find this useful. Thanks a lot!
@ghostelet - feel free to use it in whatever form you like (w/o copyright notice). You may treat it as public domain.