title: fyne の中国語フォントの永久的な解決策
date: 2021-09-07 14:32:00
toc: true
category:
- Golang
- fyne
tags: - Golang
- fyne
- サポート
- 中国語
- フォント
- 永久
- 解決
- ソリューション
起因#
現在のバージョンの fyne は中国語のサポートがあまり友好的ではなく、fyne を呼び出して中国語を表示するコードを試したところ、結果は以下の通りです:
コードは以下の通りです:
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 の中国語サポート#
ドキュメントには二つのソリューションが示されています:
- 環境変数
FYNE_FONT
を使用して.ttf
タイプのフォントを指定します。参照:Text | Develop using Fyne - フォントファイルをバンドルする(すなわちカスタムテーマ)、参照:Creating a Custom Theme | Develop using Fyne
環境変数 FYNE_FONT
の使用#
fyne の組み込みテーマを使用する場合、環境変数でフォントファイルを指定すると、それをフォントとして使用できます。
Windows での環境変数の指定#
Windows では、環境変数 FYNE_FONT
を現在のシステムがサポートする中国語フォント(例えば 华文隶书 常规
フォント)に設定します。フォント名は右クリックのプロパティから取得できます:
その後、環境変数を設定します:
Linux およびその他の Unix 系 OS での環境変数の指定#
FYNE_FONT=STLITI.TTF go run main.go
コードを実行すれば、中国語の内容が表示されるようになります。
コードは以下の通りです:
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.App
の Settings().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{})
が具体的な呼び出し方法で、実行結果は以下の通りです: