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

Yeni konular

Geri
Yukarı