c++ 当语言为韩语或中文时,如何更改特定UI(QML)的字体?

enyaitl3  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(193)

我有下面的QML文档(为了简化)-

  1. Item {
  2. Label { // Label1
  3. text: qsTr("Label1")
  4. }
  5. Label { //Label2
  6. text: qsTr("Label2")
  7. }
  8. }

我有一个C++类,它搜索翻译QM文件,并在用户更改应用程序语言时调用installTranslator。翻译工作正常。
要求是,如果当前语言是韩语或中文,我需要更改Label1的字体,但Label2的字体不应更改。如果语言不是这两种语言之一,则Label1Label2的字体应该相同。
你能告诉我,我如何检测当前的语言是韩语还是汉语,当发生这种情况时,我们如何才能得到语言已经改变的信号?

ecbunoof

ecbunoof1#

我们可以用qsTr()来解决这个问题。
例如,我们可以引入qsTr("western"),默认为"western"。对于中文,(日语)和韩语,您可以使用Linguist将qsTr("western")更改为,比方说,"cjk"。然后,我们可以使用它来帮助在默认font.family和亚洲字体家族之间切换,仅针对Label1而不是Label2。

  1. Label { // Label1
  2. text: qsTr("Label1")
  3. property TextMetrics tm: TextMetrics { }
  4. font.family: qsTr("western") === "western" ? tm.font.family : "some-cjk-font-family"
  5. }
  6. Label { //Label2
  7. text: qsTr("Label2")
  8. }

如果你想在多个地方应用这个逻辑,你可以重构一些你可以绑定到的属性:

  1. property string cjkCheck: qsTr("western") // "western" (default) or "cjk" (Chinese, Japanese, or Korean)
  2. property bool isCJK: cjkCheck !== "western"
  3. property TextMetrics tm: TextMetrics { }
  4. property string cjkFontFamily: isCJK ? "some-cjk-font-family" : tm.font.family
  5. Label { // Label1
  6. text: qsTr("Label1")
  7. font.family: cjkFontFamily
  8. }
  9. Label { //Label2
  10. text: qsTr("Label2")
  11. }

[编辑]
根据您最近的评论,另一个解决方案是您可以有一个LocalizedLabel,例如:

  1. // LocalizedLabel.qml
  2. import QtQuick
  3. import QtQuick.Controls
  4. Label {
  5. font.family: qsTr("Arial")
  6. }

然后,您可以在需要时使用LocalizedLabel。这意味着,你可以默认为“Arial”或选择一个特定的字体家族,并通过以下方式管理它:(1)一个可重用的LocalizedLabel组件,(2)通过Linguist管理字体家族。

  1. LocalizedLabel { // Label1
  2. text: qsTr("Label1")
  3. }
  4. Label { //Label2
  5. text: qsTr("Label2")
  6. }
展开查看全部

相关问题