はじめに
Fyneは基本では日本語を扱うことができません。ですが、カスタムテーマを使えば、日本語が扱えるようになると言うことで実際に試してみました。
前提条件
OS:Ubuntu22.04LTS
Go:go version go1.20.5 linux/amd64
※ Go言語とFyneはインストール済みとします。
fyneのインストールは、Fyne Develop Getting Started、または、@hibikingさんのこちらの記事GO言語のGUIライブラリ「Fyne」のインストール方法を参考にしてください
参考とした記事
Fyne公式のドキュメント
https://developer.fyne.io/
GitHubGist(lusinganderさんの記事)
https://gist.github.com/lusingander/9c30e6b0ac268c6596bcb95b85943c4e
準備
作成するファイル
bundle.go -> フォントデータを登録
theme.go -> カスタムテーマの記述
main.go -> カスタムテーマを組み込みます
※ 全てのファイルもmainパッケージとし、それぞれ必要となるライブラリをインポートしてください
フォントファイルの準備
今回はlusinganderさんの記事を参考にM+FONTSを利用しています。 url(http://mplus-fonts.osdn.jp/)
※ フォントはレギュラーとボールドの2つのフォントを使用します。
フォントファイルのバンドル
まず、フォントファイルをFyneで使用できるようbundle.goにします。
コマンドは
fyne bundle フォントのファイル > bundle.go
でOKなはずですが、ここで問題があります、このfyne bundleコマンドは、標準出力へ
「パッケージ文+インポート文+バンドルするファイルのデータ」を出力します。
なので、2つ目以降のファイルをバンドルしようとして、
fyne bundle 2つ目のフォントのファイル > bundle.go
とすると上書きされてしまい、また
fyne bundle 2つ目のフォントのファイル >> bundle.go
とすると「パッケージ文+インポート文」が二重になってしまいます。
なので、Fyne公式の「Bundling resource」にある通り
fyne bundle -o bundle.go 1つ目のフォントのファイル
fyne bundle -o bundle.go -append 2つ目のフォントのファイル
とするとうまく行きます。
カスタムテーマを準備する
これもFyne公式の「Creating a Custom Theme」を参考に、fyne.Themeインターフェイスを実装します。
まず、カスタムテーマの元になる空の構造体を作ります。
type myTheme struct{}
次に、その後に次の文を書きます。※ コンパイルエラー関連?(私にはよくわかりませんせした。)
var _ fyne.Theme = (*myTheme)(nil)
そして、fyne.Themeインターフェースを実装します。4つのメソッド(Font・Color・Icon・Size)の全てを実装する必要があります。
※ このコードは、lusinganderさんの物のそのままです。
func (*myTheme) 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 resourceMplus1cBoldTtf
}
if s.Italic {
return theme.DefaultTheme().Font(s)
}
return resourceMplus1cRegularTtf
}
func (*myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
return theme.DefaultTheme().Color(n, v)
}
func (*myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
return theme.DefaultTheme().Icon(n)
}
func (*myTheme) Size(n fyne.ThemeSizeName) float32 {
return theme.DefaultTheme().Size(n)
}
後は、main.goでカスタムテーマをセットします。
a := app.New()
a.Settings().SetTheme(&myTheme{})
終わりに
実際にどうなるかはlusinganderさんのレポジトリにコードがありますのでそちらを実行してみてください。
fyne公式とlusinganderさんの記事を参考に四苦八苦しながら動かしてみました。もしGo Fyneで日本語を表示してみたい方に参考としてもらえたら幸いです。
ではでは