banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

fyne は中国語フォントの永久的な解決策をサポートしています

title: fyne の中国語フォントの永久的な解決策
date: 2021-09-07 14:32:00
toc: true
category:

  • Golang
  • fyne
    tags:
  • Golang
  • fyne
  • サポート
  • 中国語
  • フォント
  • 永久
  • 解決
  • ソリューション

起因#

現在のバージョンの fyne は中国語のサポートがあまり友好的ではなく、fyne を呼び出して中国語を表示するコードを試したところ、結果は以下の通りです:

image.png

コードは以下の通りです:

package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

func main() {
	a := app.New()
	w := a.NewWindow("font")
	w.Resize(fyne.NewSize(300, 200))
	w.SetContent(
		fyne.NewContainerWithLayout(
			layout.NewVBoxLayout(),
			layout.NewSpacer(),
			widget.NewLabel("撒旦撒旦"),
			widget.NewLabel("委屈额为"),
			widget.NewButton("请问犬瘟热第三方", func() {
				dialog.ShowInformation("非公式の", "从v风格化风格化", w)
			}),
			layout.NewSpacer(),
		),
	)
	w.ShowAndRun()
}

現在、fyne が中国語をサポートするには、公式ドキュメントを詳しく読む必要があります(Text | Develop using Fyne)才能够得到答案。

fyne の中国語サポート#

ドキュメントには二つのソリューションが示されています:

  1. 環境変数 FYNE_FONT を使用して .ttf タイプのフォントを指定します。参照:Text | Develop using Fyne
  2. フォントファイルをバンドルする(すなわちカスタムテーマ)、参照:Creating a Custom Theme | Develop using Fyne

環境変数 FYNE_FONT の使用#

fyne の組み込みテーマを使用する場合、環境変数でフォントファイルを指定すると、それをフォントとして使用できます。

Windows での環境変数の指定#

Windows では、環境変数 FYNE_FONT を現在のシステムがサポートする中国語フォント(例えば 华文隶书 常规 フォント)に設定します。フォント名は右クリックのプロパティから取得できます:

image.png

その後、環境変数を設定します:

image.png

Linux およびその他の Unix 系 OS での環境変数の指定#

FYNE_FONT=STLITI.TTF go run main.go

コードを実行すれば、中国語の内容が表示されるようになります。

image.png

コードは以下の通りです:

package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

func main() {
	a := app.New()
	w := a.NewWindow("font")
	w.Resize(fyne.NewSize(300, 200))
	w.SetContent(
		fyne.NewContainerWithLayout(
			layout.NewVBoxLayout(),
			layout.NewSpacer(),
			widget.NewLabel("撒旦撒旦"),
			widget.NewLabel("委屈额为"),
			widget.NewButton("请问犬瘟热第三方", func() {
				dialog.ShowInformation("非公式の", "从v风格化风格化", w)
			}),
			layout.NewSpacer(),
		),
	)
	w.ShowAndRun()
}

環境変数方式の欠点#

見た目は良さそうですが、この方法ではコンパイルされたプログラムを配布する際に多くの問題が発生します。

フォントファイルのバンドル(カスタムテーマ)#

fyne はデフォルトのテーマを提供しており、テーマの設定項目にはフォントが含まれているため、カスタムテーマを使用して任意のフォントを使用できます。

カスタムテーマは、テーマインターフェースを実装することで得られます。

フォントと go コードのバンドル#

例えば、フォント 常规体粗体 をバンドルします。

コマンドは:

fyne bundle STLITI.ttf > bundle.go
fyne bundle -append STLITI-bold.ttf >> bundle.go

fyne bundle コマンド#

GUI アプリケーションで、ボタンのアイコンとして画像を使用したい場合、アプリケーションを配布する際にリソースファイル(画像ファイルなど)を単一のバイナリファイルに統合できます。

Fyne はこの操作を実行するためのメカニズムと便利なコマンドを提供しています。

fyne bundle は、リソースファイル(画像など)を Fyne が処理できるデータ(バイト原始データを持つ構造体)に変換します。

具体的には、次のリンクを参照してください:https://github.com/fyne-io/fyne/tree/master/cmd/fyne

テーマ Struct の定義#

使用するテーマの struct 名称を定義し、fyne.Theme インターフェースを実装します。

その中で Font はビジネスロジックに従って処理してください。

type Theme interface {
	Color(ThemeColorName, ThemeVariant) color.Color
	Font(TextStyle) Resource
	Icon(ThemeIconName) Resource
	Size(ThemeSizeName) float32
}

コードは以下の通りです:

package main

import (
	"image/color"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/theme"
)

type Biu struct{}

func (b Biu) Font(s fyne.TextStyle) fyne.Resource {
	if s.Monospace {
		return theme.DefaultTheme().Font(s)
	}
	if s.Bold {
		if s.Italic {
			return theme.DefaultTheme().Font(s)
		}
		return resourceSTLITITTF
	}
	if s.Italic {
		return theme.DefaultTheme().Font(s)
	}
	return resourceSTLITITTF
}

func (b Biu) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color.Color {
	return theme.DefaultTheme().Color(name, variant)
}

func (b Biu) Icon(name fyne.ThemeIconName) fyne.Resource {
	return theme.DefaultTheme().Icon(name)
}

func (b Biu) Size(name fyne.ThemeSizeName) float32 {
	return theme.DefaultTheme().Size(name)
}

カスタムテーマの使用#

fyne.AppSettings().SetTheme() メソッドを使用して実現します。例えば:

package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

func main() {
	a := app.New()
	w := a.NewWindow("font")
	a.Settings().SetTheme(&Biu{})
	w.Resize(fyne.NewSize(300, 200))
	w.SetContent(
		fyne.NewContainerWithLayout(
			layout.NewVBoxLayout(),
			layout.NewSpacer(),
			widget.NewLabel("撒旦撒旦"),
			widget.NewLabel("委屈额为"),
			widget.NewButton("请问犬瘟热第三方", func() {
				dialog.ShowInformation("非公式の", "从v风格化风格化", w)
			}),
			layout.NewSpacer(),
		),
	)
	w.ShowAndRun()
}

その中の a.Settings().SetTheme(&Biu{}) が具体的な呼び出し方法で、実行結果は以下の通りです:

image.png

完全なコードのダウンロード#

参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。