跳转到内容

BlitzMax/Modules/MaxGUI/Localization

来自维基教科书,开放世界中的开放书籍

MaxGUI.Localization 是一个简单但功能强大的本地化引擎,您可以用它来本地化您的应用程序。虽然该模块主要设计用于与 MaxGUI 工具包一起使用,但它是独立的,因此可以单独导入到其他 BlitzMax 游戏和应用程序中,而无需 MaxGUI 其他部分的开销。

建议您在使用前通读下面的命令集,以熟悉该模块。

在适用情况下,MaxGUI 编码人员应使用 LocalizeGadget 命令在 MaxGUI.MaxGUI 中,而不是使用 LocalizeString 命令,以确保在更改语言或本地化设置时更新小工具。

CreateLanguage

[编辑 | 编辑源代码]

Function CreateLanguage:TMaxGuiLanguage( name$ )

描述: 创建一个新的空语言,用于 MaxGUI 的本地化系统。

信息: 如果需要从头开始创建一个新语言,则提供此函数。在大多数情况下,语言应改为使用 LoadLanguage 从 INI 文件加载。

使用 DefineLanguageTokenRemoveLanguageTokenClearLanguageTokens 命令添加和修改返回的语言。 SetLanguageNameLanguageName 也可能有用。

另见: LoadLanguageSetLocalizationLanguageLocalizeStringLocalizeGadget.

示例:

' createlanguage.bmx

Strict

Import MaxGUI.Drivers

' Enable the localization engine, and automatically localize gadgets when they are created
SetLocalizationMode(LOCALIZATION_ON|LOCALIZATION_OVERRIDE)

Global window:TGadget = CreateWindow("{{window_title}}",100,100,320,240,Null,WINDOW_TITLEBAR|WINDOW_STATUS)
	
	Global btnEnglish:TGadget = CreateButton("{{btn_english}}",5,5,100,30,window,BUTTON_RADIO)
	Global btnFrench:TGadget = CreateButton("{{btn_french}}",5,40,100,30,window,BUTTON_RADIO)
	SetButtonState( btnEnglish, True )

' Create a new 'English' language
Global lngEnglish:TMaxGUILanguage = CreateLanguage("English (English)")

DefineLanguageToken( lngEnglish, "window_title", "My Window" )
DefineLanguageToken( lngEnglish, "btn_english", "English" )
DefineLanguageToken( lngEnglish, "btn_french", "French" )

' Create a new 'French' language
Global lngFrench:TMaxGUILanguage = CreateLanguage("Français (French)")

DefineLanguageToken( lngFrench, "window_title", "Ma Fenêtre" )
DefineLanguageToken( lngFrench, "btn_english", "Anglais" )
DefineLanguageToken( lngFrench, "btn_french", "Français" )

' Set the default language
SetLocalizationLanguage( lngEnglish )

Repeat
	SetStatusText window, LanguageName( LocalizationLanguage() )
	Select WaitEvent()
		Case EVENT_GADGETACTION
			Select EventSource()
				Case btnEnglish
					SetLocalizationLanguage( lngEnglish )
				Case btnFrench
					SetLocalizationLanguage( lngFrench )
			EndSelect
		Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
			End
	EndSelect
Forever

LoadLanguage

[编辑 | 编辑源代码]

Function LoadLanguage:TMaxGuiLanguage( url:Object )

描述: 从 INI 文本流加载语言。

信息: url 可以是文件路径或任何其他可读的 TStream 对象。

INI 文本流必须至少包含一个标记为 '[LanguageDefinition]' 的 INI 部分,以及一个 'LanguageID' 标记,该标记应分配一个适当的语言名称。

典型的语言 INI 文件可能如下所示

[LanguageDefinition]

LanguageID = Français (French)
LanguageVersion = v0.1
LanguageAuthor = Various Sources

; Toolbar Tips
tb_new                                       = "Nouveau"
tb_open                                      = "Ouvrir"
tb_close                                     = "Fermer"
tb_save                                      = "Enregistrer"
tb_cut                                       = "Couper"
tb_copy                                      = "Copier"
tb_paste                                     = "Coller"
...
tb_home                                      = "Page d'Accueil"
tb_back                                      = "Précédente"
tb_forward                                   = "Suivante"

; Tabs
tab_help                                     = "Aide"
tab_output                                   = "Sortie"
tab_locked:%1                                = "construction:%1"

; Time Format, by example: 13:09:02
; h = 1 (12 hour clock)       hh = 13 (24 hour clock)
; m = 9 (without leading 0)   mm = 09 (including leading 0)
; s = 2 (without leading 0)   ss = 02 (including leading 0)
; pp = {{pm}} (or '{{am}}' from 00:00 -> 11:59)

longtime = hh:mm:ss pp
shorttime = {{longtime}}          ; We want short time to be formatted exactly like {{longtime}}

; Date Format, by example: 9th June 2009
; d = 9    dd = 09    ddd = {{Wed}}    dddd = {{Wednesday}}
; m = 6    mm = 06    mmm = {{Jun}}    mmmm = {{June}}
; yy = 09  yyyy = 2009             oo = {{th}}

longdate = dddd doo mmmm dddd     ; e.g. Wednesday 9th June 2009
shortdate = dd/mm/yy              ; e.g. 09/06/09

; AM / PM
am = AM
pm = PM

; Ordinals

st = e
nd = er
rd = e
th = e

; Days of the week

Monday = "Lundi"
Mon = "Lun"
Tueday = "Mardi"
Tue = "Mar"
Wednesday = "Mercredi"
Wed = "Mer"
Thursday = "Jeudi"
Thu = "Jeu"
Friday = "Vendredi"
Fri = "Ven"
Saturday = "Samedi"
Sat = "Sam"
Sunday = "Dimanche"
Sun = "Dim"

INI 文件支持以下转义序列字符

INI 转义序列 BlitzMax 等效项
\\ ~\ 
\r ~r
\n ~n
\t ~t
\# #
\; ;
\: :

只有当 INI 键的值用引号括起来时,才严格要求使用最后三个转义序列。例如,以下定义预计将评估为相同的字符串(#;:)。

MyToken = \#\;\:
MyToken = "#;:"
MyToken = "\#\;\:"

使用 DefineLanguageTokenRemoveLanguageTokenClearLanguageTokens 命令添加和修改返回的语言。 SetLanguageNameLanguageName 也可能有用。

要从头开始构建新语言,请改用 CreateLanguage 命令。

另见: SetLocalizationLanguageSaveLanguageLocalizeStringLocalizeGadget.

SaveLanguage

[编辑 | 编辑源代码]

Function SaveLanguage( language:TMaxGuiLanguage, url:Object )

描述: 将语言作为 INI 部分保存到提供的流。

信息: url 可以是文件路径或任何其他可写入的 TStream 对象。

如果 url 是以 "/" 或 "\" 结尾的字符串,则假定 url 是目录路径,并将附加默认文件名,如下所示

url = String(url) + LanguageName(language).Split(" ")[0] + ".language.ini"

警告: 此命令将自动覆盖提供的/生成的路径上的任何现有文件。

另见: LoadLanguageSetLocalizationLanguageLocalizeStringLocalizeGadget.

SetLanguageName

[编辑 | 编辑源代码]

Function SetLanguageName( language:TMaxGuiLanguage, name$ )

描述: 重新定义语言的名称。

信息: 另见: LanguageNameLoadLanguageCreateLanguageSetLocalizationLanguage.

LanguageName

[编辑 | 编辑源代码]

Function LanguageName$( language:TMaxGuiLanguage )

描述: 返回语言的名称。

信息: 另见: SetLanguageNameLoadLanguageCreateLanguageSetLocalizationLanguage.

DefineLanguageToken

[编辑 | 编辑源代码]

Function DefineLanguageToken( language:TMaxGuiLanguage, token$, value$ )

描述: 为本地化令牌定义特定于语言的值。

信息: 本地化令牌不区分大小写,如果语言中已存在令牌定义,则令牌值将被此最新的 value$ 覆盖。

另见: LoadLanguageCreateLanguageSaveLanguageSetLocalizationLanguage.

LanguageTokenDefinition

[编辑 | 编辑源代码]

Function LanguageTokenDefinition$( language:TMaxGuiLanguage, token$ )

描述: 查找特定语言的令牌值。

信息: 本地化令牌不区分大小写,并且要么与语言一起加载,要么使用 DefineLanguageToken 命令定义。

如果在语言中找不到显式令牌定义,则返回 token$ 字符串,因为它被传递。

另见: LoadLanguageCreateLanguageSaveLanguageSetLocalizationLanguage.

RemoveLanguageToken

[编辑 | 编辑源代码]

Function RemoveLanguageToken( language:TMaxGuiLanguage, token$ )

描述: 从语言中删除令牌定义。

信息: 唯一不能删除的令牌是 'LanguageID',因为每种语言都需要定义此令牌 - 它定义了语言名称。如果未定义匹配的令牌,则命令将静默返回。

注意: 本地化令牌不区分大小写,因此以下所有命令都请求删除相同的令牌

RemoveLanguageToken( language, "WelcomeMessage" )
RemoveLanguageToken( language, "WELCOMEMESSAGE" )
RemoveLanguageToken( language, "welcomemessage" )
RemoveLanguageToken( language, "WeLcOmEmEsSaGe" )

另见: ClearLanguageTokensDefineLanguageTokenLoadLanguageCreateLanguageSaveLanguageSetLocalizationLanguage.

ClearLanguageTokens

[编辑 | 编辑源代码]

Function ClearLanguageTokens( language:TMaxGuiLanguage )

描述: 删除语言中定义的所有令牌。

信息: 唯一不会被删除的令牌是 'LanguageID',因为每种语言都需要定义此令牌 - 它定义了语言名称。

另见: RemoveLanguageTokenDefineLanguageTokenLoadLanguageCreateLanguageSaveLanguageSetLocalizationLanguage.

LocalizeString

[编辑 | 编辑源代码]

Function LocalizeString$( localizationstring$ )

描述: 返回字符串的本地化版本。

信息: 此函数接受一个参数: localizationstring$

本地化字符串就像任何其他字符串一样,除了用一对双花括号括起来的任何短语都被识别为本地化令牌。例如,以下所有示例都使用有效的本地化字符串。

LocalizeString("{{welcomemessage}}")                      'Localization token(s): welcomemessage
LocalizeString("{{apptitlelabel}}: {{AppTitle}}")         'Localization token(s): apptitlelabel, AppTitle
LocalizeString("Current Time: {{CurrentTime}}")           'Localization token(s): CurrentTime

本地化标记不区分大小写,可以由任意组合的字母数字字符组成。 首先,会测试标记是否是保留字。 以下标记当前被保留(虽然将来可能会添加更多):

本地化标记 标记将被替换为...
AppDir 全局常量的值 AppDir
AppFile 全局常量的值 AppFile
AppTitle 全局常量的值 AppTitle
LaunchDir 全局常量的值 LaunchDir
GCMemAlloced 函数返回的值 GCMemAlloced(在解析标记时)。

还有一些保留的日期和时间标记,它们将使用当前语言中定义的任何格式显示当前日期和时间(在解析时)。 如果没有明确定义匹配的格式,则格式默认设置为

本地化标记 默认格式 示例输出
ShortTime "hh:mm pp" 02:36 {{pm}}
LongTime "hh:mm:ss" 14:36:51
ShortDate "dd/mm/yy" 04/08/09
LongDate "dddd doo mmmm yyyy" {{Monday}} 4{{th}} {{August}} 2009

注意如何将任何基于文本的日期和时间信息包含在花括号中。 这些标记将被本地化,就像任何其他标记一样,因此可以通过向本地化语言添加相应的条目来修改它们。

这也演示了本地化解析器处理嵌套标记的能力。 为了防止死锁,本地化解析器会检查循环标记定义,如果遇到循环标记定义,则该标记将简单地替换为“!ERROR!”,并且违规的本地化字符串将在写入标准错误的警告消息中标识。

当且仅当本地化标记不是保留字时,才会查询当前本地化语言。 如果没有选择本地化语言,或者当前语言中没有定义匹配的标记,则该标记将在返回的字符串中简单地删除其花括号。 每个语言都必须至少定义一个标记:{{LanguageID}}。 这应该代表语言名称,例如“Français (French)”。

注意:此功能需要设置 LOCALIZATION_ON 标志(请参阅 SetLocalizationMode),否则该功能将简单地返回 localizationstring$,就像它被传递时的样子(包括任何花括号)。

另请参阅:SetLocalizationModeLocalizationModeSetLocalizationLanguageLocalizationLanguage

SetLocalizationMode

[edit | edit source]

Function SetLocalizationMode( mode:Int = LOCALIZATION_ON )

描述:启用或禁用本地化引擎,并设置其他本地化模式。

信息:该模式可以设置为

常量 含义
LOCALIZATION_OFF 任何本地化的小部件将显示其 localizedtext$ 作为其实际文本。
LOCALIZATION_ON 本地化小部件将使用当前语言来显示其文本。

这两种模式都可以与 LOCALIZATION_OVERRIDE 组合(按位或运算),这将导致小部件在创建时自动“本地化”,任何提供给 CreateGadget() 函数的 text$ 参数都被解释为本地化字符串。

如果任何窗口菜单已本地化,则可能需要在所有相关窗口上调用 UpdateWindowMenu 才能使文本更改可见。

另请参阅:LocalizationModeSetLocalizationLanguageLocalizationLanguageLocalizeGadget

LocalizationMode

[edit | edit source]

Function LocalizationMode:Int()

描述:返回先前使用 SetLocalizationMode 设置的值。

信息:MaxGUI 程序的默认值为 LOCALIZATION_OFF。

请参阅 SetLocalizationMode 以了解有效模式及其相应的常量。

SetLocalizationLanguage

[edit | edit source]

Function SetLocalizationLanguage( language:TMaxGUILanguage )

描述:设置 MaxGUI 的本地化系统要使用的语言。

信息:可以使用 LoadLanguage 从文件/流加载语言,并可以使用 CreateLanguage 从头开始创建语言。

此函数将自动更新使用 LocalizeGadget 标记为“本地化”的任何小部件的文本。

如果任何窗口菜单已本地化,则可能需要在所有相关窗口上调用 UpdateWindowMenu 才能使文本更改可见。

另请参阅:LocalizationLanguageSetLocalizationModeLocalizationModeLocalizeString

LocalizationLanguage

[edit | edit source]

Function LocalizationLanguage:TMaxGUILanguage()

描述:返回 MaxGUI 的本地化系统使用的当前语言。

信息:使用 DefineLanguageTokenRemoveLanguageTokenClearLanguageTokens 命令来添加和修改返回的语言。 SetLanguageNameLanguageName 也可能有用。


信息:另请参阅:SetLocalizationLanguageSetLocalizationModeLocalizationModeLocalizeGadget

华夏公益教科书