Hüseyin Çelik Blog Sayfasi

.Net, Java, Android, Progress 4gl Paylasimlarim

Devexpress XAF çoklu dil eXpressApp Framework Localization

Merhaba arkadaslar, bu yazimda XAF çoklu dil destegini anlatmaya çalisacagim. Öncelikle bir xaf projesinde model editorle projemize dil ekmeliyiz. Programimizin destekleyecegi tüm dilleri eklemeliyiz.

XAF Localization

Dilleri ekledikten sonra localization butonuyla çeviri ekranindan tüm metinleri çeviriyoruz.

eXpressApp Framework Localization

Burda bazi metinleri göremeyebilirsiniz, örnegin Loading, Field Chooser vb. Bu alanlarida getirmek için application design ekranina geçiyoruz. Resources exported to model ekraninda kullandigimiz xaf modülleri listeleniyor.

Resources Exported To Model

Xaf model editorden kendi mesaj ve basliklarimizida ekleyebiliriz. Örnegin ekranlara bazi labeller ekliyoruz, ve kullaniciya kendi tanimladigimiz bir hata mesajini çoklu dil destegiyle göstermek istiyoruz. Web custom label ve parola zaman asimi diye iki adet alan ekledik. Bu alanlarin çevirilerini localization butonuyla girdigimiz ekran yapabilecegimiz gibi burdan da yapabiliriz. Tabi burdan bir dil için yapiyorz.

Simdi kullanimini görelim.

<%@ Import Namespace="DevExpress.ExpressApp.Utils" %>

CaptionHelper.GetLocalizedText("WebCustomLabel", "Songiris")

CaptionHelper.GetLocalizedText("Messages", "Parolazamansimi")

Simdi enumlarda çok dile basit bir örnek vereyim. Enumlar veritabaninda int olarak tutulur ekranda ise Combobox olarak görüntülenir. Bu nedenle Xaf de enum çok kullanislidir.

 public enum KayitDurumu
{
    [ImageName("Action_New"), DisplayName("Yeni Kayit")]
    Yeni = 0,
    [ImageName("Action_Grant"), DisplayName("Kayit Tamamlandi")]
    Tamamlandi = 1,
    [ImageName("Action_CloseAllWindows"), DisplayName("Kayit Iptal Edildi")]
    Iptal = 2,
    [ImageName("State_Validation_Skipped"), DisplayName("Kayit ERP'ye Aktarilacak")]
    Aktarilacak = 3,
    [ImageName("State_Validation_Valid"), DisplayName("Kayit ERP'ye Aktarildi")]
    Aktarildi = 4,
    [ImageName("Action_Delete"), DisplayName("Kayit Kapandi")]
    Kapali = 5
}

Eger bu örnekteki gibi kullanirsaniz ekrana resimli bir combobox koymus olursunuz. Kod tarafinda bu bilgilere ihtiyacimiz olursa ..

foreach (object current in Enum.GetValues(typeof(KayitDurumu)))
{
    EnumDescriptor ed = new EnumDescriptor(enumType);
    string caption = ed.GetCaption(current);
    string imageName = ImageLoader.Instance.GetEnumValueImageName(current);
}

Son olarak belki sizin sisteminiz ayni anda iki dilli olarak çalisacaktir. Iste böyle bir durumda uygulama default dile göre degil kullanicidan alacagi dile göre çalismalidir. Bunu yapmak için kendi kullanici tipinizi tanimlamalisiniz, bunu ilerde anlatacagim. Bu kullanici tipinizde dil alaniniz olmalidir. Web epplication metodlarindan OnLoggedOn içinde yani kullanici login olduktan sonra kullaniciya göre dil ayarini degistirmelisiniz. Kullanici tanimlarken seçilebilecek dilleri tanimliyoruz.

 public enum Diller
 {
     [ImageName("tr"), DisplayName("Türkçe"), System.ComponentModel.Description("tr-TR")]
     Turkce,
     [ImageName("en"), DisplayName("English"), System.ComponentModel.Description("en-US")]
     Ingilizce,
     [ImageName("fr"), DisplayName("French"), System.ComponentModel.Description("fr-FR")]
     Fransizca,
     [ImageName("de"), DisplayName("Germany"), System.ComponentModel.Description("de-DE")]
     Almanca
 }

Örnek kullanici objemiz.

[CreatableItem(false)]
[Persistent("T_Kullanicilar")]
[NavigationItem(true), ImageName("BO_Role")]
[DeferredDeletion(false), OptimisticLocking(false)]
[DefaultClassOptions, XafDefaultProperty("UserName")]
[ModelDefault("DefaultListViewShowAutoFilterRow", "True")]
public class Kullanici : DevExpress.ExpressApp.Security.Strategy.SecuritySystemUser
{
    public Kullanici() : base(Session.DefaultSession) { }
    public Kullanici(Session session) : base(session) { }

    private KullaniciTip fKullaniciTipi = KullaniciTip.Diger;
    [Indexed]
    [XafDisplayName("Kullanici Tipi")]
    [VisibleInListView(false)]
    [VisibleInLookupListView(true)]
    public KullaniciTip KullaniciTipi
    {
        get
        {
            return fKullaniciTipi;
        }
        set
        {
            SetPropertyValue<KullaniciTip>("KullaniciTipi", ref fKullaniciTipi, value);
        }
    }

    private Diller fDil = Diller.Turkce;
    [VisibleInListView(true), VisibleInDetailView(true), VisibleInLookupListView(false)]
    public Diller Dil
    {
        get { return fDil; }
        set { SetPropertyValue("Dil", ref fDil, value); }
    }

    #region Ortak Alanlar
    protected SecuritySystemUser fOlusturanKullanici;
    [ModelDefault("AllowEdit", "False")]
    [ReadOnly(true)]
    [XmlIgnore()]
    [VisibleInListView(false)]
    [VisibleInLookupListView(false)]
    [XafDisplayName("Olusturan Kullanici")]
    public SecuritySystemUser OlusturanKullanici
    {
        get { return fOlusturanKullanici; }
        set { SetPropertyValue<SecuritySystemUser>("OlusturanKullanici", ref fOlusturanKullanici, value); }
    }

    protected DateTime fOlusturmaTarihi;
    [ModelDefault("AllowEdit", "False")]
    [ReadOnly(true)]
    [XmlIgnore()]
    [ModelDefault("DisplayFormat", "{0:dd MMM yyyy ddd HH:mm}")]
    [VisibleInListView(false)]
    [VisibleInLookupListView(false)]
    [XafDisplayName("Olusturma Tarihi")]
    public DateTime OlusturmaTarihi
    {
        get { return fOlusturmaTarihi; }
        set { SetPropertyValue<DateTime>("OlusturmaTarihi", ref fOlusturmaTarihi, value); }
    }

    protected SecuritySystemUser fGüncelleyenKullanici;
    [ModelDefault("AllowEdit", "False")]
    [ReadOnly(true)]
    [XmlIgnore()]
    [VisibleInListView(false)]
    [VisibleInLookupListView(false)]
    [XafDisplayName("Güncelleyen Kullanici")]
    public SecuritySystemUser GüncelleyenKullanici
    {
        get { return fGüncelleyenKullanici; }
        set { SetPropertyValue<SecuritySystemUser>("GüncelleyenKullanici", ref fGüncelleyenKullanici, value); }
    }

    protected DateTime fGuncellemeTarihi;
    [ModelDefault("AllowEdit", "False")]
    [ReadOnly(true)]
    [XmlIgnore()]
    [ModelDefault("DisplayFormat", "{0:dd MMM yyyy ddd HH:mm}")]
    [VisibleInListView(false)]
    [VisibleInLookupListView(false)]
    [XafDisplayName("Güncelleme Tarihi")]
    public DateTime GuncellemeTarihi
    {
        get { return fGuncellemeTarihi; }
        set { SetPropertyValue<DateTime>("GuncellemeTarihi", ref fGuncellemeTarihi, value); }
    }
    #endregion

    protected override void OnSaving()
    {
        if (IsDeleted)
        {
        }
        else
        {
            Kullanici currentUser = SecuritySystem.CurrentUser as Kullanici;
            if (this.Session.IsNewObject(this))
            {
                this.OlusturanKullanici = currentUser != null ? this.Session.GetObjectByKey<Kullanici>(currentUser.Oid) : this;
                this.OlusturmaTarihi = DateTime.Now;
            }
            else
            {
                this.GüncelleyenKullanici = currentUser != null ? this.Session.GetObjectByKey<Kullanici>(currentUser.Oid) : null;
                this.GuncellemeTarihi = DateTime.Now;
            }

            if (this.ChangePasswordOnFirstLogon)
                this.SetPassword(string.Empty);
        }
		
        base.OnSaving();
    }
}

Kullanici login oldugunda xaf dil ayarlarini yapmak için application objemize gidiyoruz, application objemizdeki onlogin metodunu degistiriyoruz.

protected override void OnLoggedOn(LogonEventArgs args)
{ 
    base.OnLoggedOn(args);

    Kullanici currentUser = SecuritySystem.CurrentUser as Kullanici;
    if (!string.IsNullOrWhiteSpace(currentUser.Dil))
    {
		Type t = currentUser.Dil.GetType();
		var memberInfo = t.GetMember(currentUser.Dil.ToString());
		var attributes = memberInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
		this.Model.PreferredLanguage = ((System.ComponentModel.DescriptionAttribute)attributes[0]).Description;
    }
}

Burda belki kullanici login esnasinda dil seçmesi istenebilir, o zamanda CustomAuthentication kullanmalisiniz ve dil enumunu bu objeye eklemelisiniz.

Sorunuz olursa yardimci olmaktan mutluluk duyarim.

https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument113301

 

Loading