Çözüldü PyQt'de sistem diline göre yazı değiştirme nasıl yapılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

BayCoder

Picopat
Katılım
8 Mart 2021
Mesajlar
443
Makaleler
4
Çözümler
3
Merhabalar, belki bilenler vardır bir süredir PyQt ile uğraşıyorum ve bir program yapıyorum. Bu programda olan buton ve label kısımlarının sistem diline göre değişmesini istiyorum. Mesela sistem İngilizce ise "Merhaba" olan kısım "Hello" olacak. Bunu nasıl yapabilirim? Cevabınız değişir mi bilmiyorum ama programı Debian ile geliştiriyorum.
 
Çözüm
Öncelikle sistem dilini öğrenmekle başlayalım.

Aşağıdaki kodun çıktısı "en_US", "tr_TR" gibi şekillerde olacaktır.

Örnek:
import locale

print(locale.getdefaultlocale()[0]) # getdefaultlocale() fonksiyonundan gelen ('en_US', 'UTF-8') şeklindeki çıktıdan [0] yazarak ilk elemeanı alıp 'en_US' kısmını elde ettik.

Uygulama için dil oluşturmakla devam edelim. Dil dosyası oluşturan program için ayrı bir .py dosyası oluşturalım. Dil dosyası oluşturma kısmı için ben dictionary oluşturup JSON ile saklamayı tercih ediyorum.

dil_olusturucu.py:
import json

# İngilizce dil için dictionary.
lang_en = {
    "hello": "Hello World!",
    "detected_lang": "Detected language is"
}

# Türkçe dil için dictionary.
lang_tr = {
    "hello": "Merhaba Dünya!",
    "detected_lang": "Algılanan dil"
}

# Dosya açıp JSON ile yazma işlemleri. Özellikle dosya adını locale.getdefaultlocale()'in döndürdüğü değerlere göre oluşturuyoruz.

with open("en_US.json", "w", encoding="UTF-8") as dosya:
    json.dump(lang_en, dosya)

with open("tr_TR.json", "w", encoding="UTF-8") as dosya:
    json.dump(lang_tr, dosya)

Şimdi asıl Python programımızda dili algılayıp, ilgili dosyayı okuyup, kullanalım.

ornek_program.py:
import locale
import json
from os import path

# Sistem dilini öğrenme.
sistem_dili = locale.getdefaultlocale()[0]

# Dil dosyasının varlığını kontrol edip varsa okuma ve içeriğini "dil" isimli değişkene atma.
if path.isfile("{}.json".format(sistem_dili)):
    try:
        with open("{}.json".format(sistem_dili), "r", encoding="UTF-8") as dosya:
            dil = json.load(dosya)
    except:
        print("Hata.")
else:
    print("{} için dil dosyası bulunamadı, varsayılan dil dosyası yükleniyor.".format(sistem_dili))
    try:
        sistem_dili = "tr_TR"
        with open("{}.json".format(sistem_dili), "r", encoding="UTF-8") as dosya:
            dil = json.load(dosya)
    except:
        print("Hata.")

# dil.get("dictionary_anahtarı") yapısı ile anahtarın karşılığı olan değeri alabiliyoruz. Bulamazsa boş dönüş yapıyor. Eğer dil["dictionary_anahtarı"] şeklinde kullansaydık bulamadığı zaman hata verecekti.
print("{} {}.".format(dil.get("detected_lang"), sistem_dili))

print(dil.get("hello"))

PyQt için ise önceden dil dosyasını okuyup, değişkene atıp daha sonra Qt5 Designer'in oluşturduğu retranslateUi fonksiyonu altındaki değerleri dil.get("anahtar") yapısı ile değiştiriyorum.

Örnek:
self.themeLabel.setText(_translate("DialogPreferences", language.get("theme")))

Yazdığım koddaki yorum satırlarını okumayı unutmayın. Ben bu şekilde çoklu dil yapıyorum. Değiştirilebilir yapmak istiyorsanız bir ayarlar dosyası da oluşturup onu okuyabilir, dili değiştirirken ise bir ayarlar menüsündeki ComboBox'a dil klasöründeki bütün dillerin isimlerini yazdırıp seçilen dili ayarlar dosyasına yazabilirsiniz. Bu sayede dil için sınırsız JSON dosyası oluşturabilir ve asıl programın kodunu değiştirmeden dinamik bir şekilde bütün dilleri kullanabilmesini sağlayabilirsiniz.

Türkçe kısmını deneyemedim ama eğer locale.getdefaultlocale()[0], tr_TR olarak çıktı veriyorsa JSON dosyasını da okuyacaktır.

Sorunuz olursa yazmaktan çekinmeyin.

ahmed ensar

Hectopat
Katılım
15 Şubat 2016
Mesajlar
783
Makaleler
7
Çözümler
4
Buradan dili tespit edip buna göre uygulama dilini otomatik değişecek şekilde yapabilirsin.
 
KS
KS
B

BayCoder

Picopat
Katılım
8 Mart 2021
Mesajlar
443
Makaleler
4
Çözümler
3
Buradan dili tespit edip buna göre uygulama dilini otomatik değişecek şekilde yapabilirsin.

Hocam buna baktım ama pek bir şey anladığım söylenemez. Şimdi en çok oy alan yorumda
import locale. locale.getdefaultlocale() ('en_GB', 'cp1252') kodu ile iş bitmiş sanırım. Bu kodda neyin, ne olarak değişeceği hakkında bir bilgi yok. Yani sadece bu kod yazılınca bitiyor mu? Bu kadar kolay olması saçma geldi.
 

ahmed ensar

Hectopat
Katılım
15 Şubat 2016
Mesajlar
783
Makaleler
7
Çözümler
4
KS
KS
B

BayCoder

Picopat
Katılım
8 Mart 2021
Mesajlar
443
Makaleler
4
Çözümler
3
İnceleyeceğim, teşekkür ederim.
Buradan dili tespit edip buna göre uygulama dilini otomatik değişecek şekilde yapabilirsin.
Hocam bunlar tam kafama uymadı dil kısmında. Ben çift dil yapmak istiyorum,başka birşey yapamaz mıyım ?
 
Son düzenleme:

Kerem00

Megapat
Sosyal Tayfı
Katılım
11 Mayıs 2018
Mesajlar
6.736
Makaleler
2
Çözümler
137
Yer
/home
Öncelikle sistem dilini öğrenmekle başlayalım.

Aşağıdaki kodun çıktısı "en_US", "tr_TR" gibi şekillerde olacaktır.

Örnek:
import locale

print(locale.getdefaultlocale()[0]) # getdefaultlocale() fonksiyonundan gelen ('en_US', 'UTF-8') şeklindeki çıktıdan [0] yazarak ilk elemeanı alıp 'en_US' kısmını elde ettik.

Uygulama için dil oluşturmakla devam edelim. Dil dosyası oluşturan program için ayrı bir .py dosyası oluşturalım. Dil dosyası oluşturma kısmı için ben dictionary oluşturup JSON ile saklamayı tercih ediyorum.

dil_olusturucu.py:
import json

# İngilizce dil için dictionary.
lang_en = {
    "hello": "Hello World!",
    "detected_lang": "Detected language is"
}

# Türkçe dil için dictionary.
lang_tr = {
    "hello": "Merhaba Dünya!",
    "detected_lang": "Algılanan dil"
}

# Dosya açıp JSON ile yazma işlemleri. Özellikle dosya adını locale.getdefaultlocale()'in döndürdüğü değerlere göre oluşturuyoruz.

with open("en_US.json", "w", encoding="UTF-8") as dosya:
    json.dump(lang_en, dosya)

with open("tr_TR.json", "w", encoding="UTF-8") as dosya:
    json.dump(lang_tr, dosya)

Şimdi asıl Python programımızda dili algılayıp, ilgili dosyayı okuyup, kullanalım.

ornek_program.py:
import locale
import json
from os import path

# Sistem dilini öğrenme.
sistem_dili = locale.getdefaultlocale()[0]

# Dil dosyasının varlığını kontrol edip varsa okuma ve içeriğini "dil" isimli değişkene atma.
if path.isfile("{}.json".format(sistem_dili)):
    try:
        with open("{}.json".format(sistem_dili), "r", encoding="UTF-8") as dosya:
            dil = json.load(dosya)
    except:
        print("Hata.")
else:
    print("{} için dil dosyası bulunamadı, varsayılan dil dosyası yükleniyor.".format(sistem_dili))
    try:
        sistem_dili = "tr_TR"
        with open("{}.json".format(sistem_dili), "r", encoding="UTF-8") as dosya:
            dil = json.load(dosya)
    except:
        print("Hata.")

# dil.get("dictionary_anahtarı") yapısı ile anahtarın karşılığı olan değeri alabiliyoruz. Bulamazsa boş dönüş yapıyor. Eğer dil["dictionary_anahtarı"] şeklinde kullansaydık bulamadığı zaman hata verecekti.
print("{} {}.".format(dil.get("detected_lang"), sistem_dili))

print(dil.get("hello"))

PyQt için ise önceden dil dosyasını okuyup, değişkene atıp daha sonra Qt5 Designer'in oluşturduğu retranslateUi fonksiyonu altındaki değerleri dil.get("anahtar") yapısı ile değiştiriyorum.

Örnek:
self.themeLabel.setText(_translate("DialogPreferences", language.get("theme")))

Yazdığım koddaki yorum satırlarını okumayı unutmayın. Ben bu şekilde çoklu dil yapıyorum. Değiştirilebilir yapmak istiyorsanız bir ayarlar dosyası da oluşturup onu okuyabilir, dili değiştirirken ise bir ayarlar menüsündeki ComboBox'a dil klasöründeki bütün dillerin isimlerini yazdırıp seçilen dili ayarlar dosyasına yazabilirsiniz. Bu sayede dil için sınırsız JSON dosyası oluşturabilir ve asıl programın kodunu değiştirmeden dinamik bir şekilde bütün dilleri kullanabilmesini sağlayabilirsiniz.

Türkçe kısmını deneyemedim ama eğer locale.getdefaultlocale()[0], tr_TR olarak çıktı veriyorsa JSON dosyasını da okuyacaktır.

Sorunuz olursa yazmaktan çekinmeyin.
 
Son düzenleme:
Çözüm

Cassandra

Decapat
Katılım
19 Nisan 2019
Mesajlar
883
Makaleler
3
Çözümler
13
Yukarıdakine ek olarak; bazı sistemlerde sorun yaşamamak için, locale name yerine codepage e göre işlem yapmanızı tavsiye ederim. Örnek olarak Windows 11'de denediğinizde ülke ismi yerine numara kodu alırsınız ya da farklı ülke ve dil kombinasyonları kullanan kişilerde beklemediğiniz şekilde sonuç alırsınız ancak codepage ile bu risk yok, bkz.

qnHuTvV[1].png
 

Kerem00

Megapat
Sosyal Tayfı
Katılım
11 Mayıs 2018
Mesajlar
6.736
Makaleler
2
Çözümler
137
Yer
/home
Yukarıdakine ek olarak; bazı sistemlerde sorun yaşamamak için, locale name yerine codepage e göre işlem yapmanızı tavsiye ederim. Örnek olarak Windows 11'de denediğinizde ülke ismi yerine numara kodu alırsınız ya da farklı ülke ve dil kombinasyonları kullanan kişilerde beklemediğiniz şekilde sonuç alırsınız ancak codepage ile bu risk yok, bkz.

Eki Görüntüle 1173815
Arch Linux kullanıyorum, sağ tarafta "UTF-8" yazıyor. Codepage olarak sonuç almak için locale kütüphanesinin başka bir özelliği var mı ya da ben mi anlamadım demek istediğinizi?

1632601744026.png
 

Cassandra

Decapat
Katılım
19 Nisan 2019
Mesajlar
883
Makaleler
3
Çözümler
13
Arch Linux kullanıyorum, sağ tarafta "utf-8" yazıyor. Codepage olarak sonuç almak için locale kütüphanesinin başka bir özelliği var mı ya da ben mi anlamadım demek istediğinizi?

Eki Görüntüle 1173837

Windows'da aynı fonksiyon utf-8 yerine codepage dönüyor ama sadece Windows'a özel mi emin değilim. locale.getpreferredencoding() ile de denenebilir.
 
Yukarı