Çö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

Hectopat
Katılım
8 Mart 2021
Mesajlar
531
Makaleler
4
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
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.

[CODE lang="python" title="Ö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.[/CODE]

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.

[CODE lang="python" title="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)[/CODE]

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

[CODE lang="python" title="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"))[/CODE]

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.

[CODE lang="python" title="Örnek"]self.themeLabel.setText(_translate("DialogPreferences", language.get("theme")))
[/CODE]

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.
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.
 
İ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:
Öncelikle sistem dilini öğrenmekle başlayalım.

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

[CODE lang="python" title="Ö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.[/CODE]

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.

[CODE lang="python" title="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)[/CODE]

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

[CODE lang="python" title="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"))[/CODE]

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.

[CODE lang="python" title="Örnek"]self.themeLabel.setText(_translate("DialogPreferences", language.get("theme")))
[/CODE]

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
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
 
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
 
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.
 

Yeni konular

Geri
Yukarı