یکی از دغدغه های توسعه دهندگان نرم افزار و بازی امکان ایجاد اپلیکیشن های چند زبانه در پلتفرم های برنامه نویسی است. و برای توسعه دهنگان ایرانی اپلیکیشن های دو زبانه فارسی و انگلیسی. خوشبختانه کیوت (Qt) این امکان را به راحتی به توسعه دهنده می دهد که بتواند به راحتی اپلیکیشن های چند زبانه ایجاد کند.

در «ساخت اپلیکیشن چند زبانه در کیوت» با امکانات کیوت و ایجاد اپلیکیشن دو زبانه فارسی در آن آشنا شدیم. در آنجا اپلیکیشن در زمان شروع – بسته به زبان سیستم عامل – فایل های ترجمه را اعمال می کرد. و امکان اینکه در زمان اجرای برنامه زبان تغییر کند نبود. در اینجا می خواهیم به تغییر زبان در زمان اجرا بپردازیم.

اپلیکیشن دوزبانه فارسی در کیوت

در ادامه می خواهیم امکان تغییر زبان را در زمان اجرای برنامه اضافه کنیم. برای این کار یک دکمه برای تغییر زبان به فارسی و انگلیسی ایجاد می کنیم. با کلیک روی آن، متد (تابع) تغییر زبان (setLanguage) را که با کد ++C نوشته شده فراخوانی می کنیم. در متد setLanguage فایل ترجمه زبان هدف را بارگذاری می کنیم. سپس از موتور کیو ام ال (QQmlApplicationEngine) برنامه می خواهیم که برنامه را دوباره ترجمه (retranslate) کند.

آماده سازی برنامه

از آنجا که این نوشته در ادامه «ساخت اپلیکیشن چند زبانه در کیوت» است. فرض می کنیم که تمام فایل های ترجمه را با استفاده از برنامه های lupdate, linguist و lrelease ایجاد کرده اید. و فایل ها را در پوشه i18n در مسیر کد منبع برنامه قرار داده اید. فراموش نکنید که فایل های برنامه باید دارای فرمت qml_[language_code].qm باشند. مانند qml_fa.qm یا qml_fa_IR.qm.

افزودن تابع تغییر زبان

برای ارتباط بین کیو ام ال و کد سی پلاس پلاس (++C) روش های مختلفی هست. در اینجا ما یک کلاس بنام LangSet ایجاد می کنیم و در این کلاس تابع setLanguage را تعریف می کنیم. فایل سرآیند (header) و کد کلاس را به تابع qt_add_executable د فایل CMakeLists.txt اضافه می کنیم.

langset.h
#ifndef LANGSET_H
#define LANGSET_H

#include <QTranslator>
#include <QCoreApplication>
#include <QQmlApplicationEngine>
#include <QObject>

class LangSet : public QObject {
    Q_OBJECT
public:
    explicit LangSet(QQmlApplicationEngine *engine ,QObject *parent = nullptr);
    Q_INVOKABLE void setLanguage(int code);

private:
    QTranslator *m_translator;
    QQmlApplicationEngine *m_engine;
};

#endif // LANGSET_H
langset.cpp
#include "langset.h"

LangSet::LangSet(QQmlApplicationEngine *engine, QObject *parent)
    : QObject{parent} {
    m_engine = engine;
    m_translator = new QTranslator(this);
}

void LangSet::setLanguage(int code) {
    if (code == 0) { //0: default language
        QCoreApplication::removeTranslator(m_translator);
        m_engine->retranslate();
        return;
    }
    if (m_translator->load(":/FirstApp/i18n/qml_fa.qm")) {
        QCoreApplication::installTranslator(m_translator);
        m_engine->retranslate();
    }
}

فراخوانی تابع در QML

در کیو ام ال (QML) برای دسترسی به تابع تغییر به اینصورت عمل می کنیم. در فایل main.cpp یک آبجکت (Object) از کلاس LangSet ایجاد می کنیم. سپس آن را در موتور کیوام ال برنامه ثبت (register) می کنیم. حال در فایل کیو ام ال می توانیم به راحتی آن را فراخوانی کنیم.

//main.cpp
...
QQmlApplicationEngine engine;
LangSet langset(&engine);
engine.rootContext()->setContextProperty("langset", &langset);
const QUrl url(u"qrc:/FirstApp/Main.qml"_qs);
...
// using C++ type "langset" in qml
...
Button {
    id: langBtnId
    text: "فا"
    onClicked: {
        if (text === "فا") {
            text = "En"
            langset.setLanguage(1)
        } else {
            text = "فا"
            langset.setLanguage(0)
        }
    }
}
...

در تابع main برنامه ما از متد setContextProperty در موتور کیو ام ال استفاده کردیم برای ثبت langset. رشته (String) “langset” در این متد نام نوع (Type) است که ما در کیو ام ال فراخوانی می کنیم. در رویداد onClicked دکمه (Button) به راحتی می توانیم متد setLanguage از langset را اجرا کنیم.

فونت فارسی و راست چین کردن

در هر اپلیکیشن دو زبانه فارسی و هر زبان دیگری، دو نکته مهم علاوه بر ترجمه متن ها وجود دارد. یکی راست چین کردن و دیگری فونت فارسی.

برای راست چین کردن رابط برنامه می توانید از صفت LayoutMirroring المان های کیو ام ال استفاده کنید. و برای افزودن فونت فارسی هم می توانید FontLoader کیو ام ال را بکار ببرید. برای آشنایی بیشتر با این المان ها به نوشته «ساخت اپلیکیشن چند زبانه در کیوت» مراجعه کنید.

اپلیکیشن دو زبانه فارسی در کیوت
Tagged on:         

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *