BlitzMax/Modules/MaxGUI/Localization
MaxGUI.Localization 是一个简单但功能强大的本地化引擎,您可以用它来本地化您的应用程序。虽然该模块主要设计用于与 MaxGUI 工具包一起使用,但它是独立的,因此可以单独导入到其他 BlitzMax 游戏和应用程序中,而无需 MaxGUI 其他部分的开销。
建议您在使用前通读下面的命令集,以熟悉该模块。
在适用情况下,MaxGUI 编码人员应使用 LocalizeGadget 命令在 MaxGUI.MaxGUI 中,而不是使用 LocalizeString 命令,以确保在更改语言或本地化设置时更新小工具。
Function CreateLanguage:TMaxGuiLanguage( name$ )
描述: 创建一个新的空语言,用于 MaxGUI 的本地化系统。
信息: 如果需要从头开始创建一个新语言,则提供此函数。在大多数情况下,语言应改为使用 LoadLanguage 从 INI 文件加载。
使用 DefineLanguageToken、RemoveLanguageToken 和 ClearLanguageTokens 命令添加和修改返回的语言。 SetLanguageName 和 LanguageName 也可能有用。
另见: LoadLanguage、SetLocalizationLanguage、LocalizeString 和 LocalizeGadget.
示例:
' 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
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 = "\#\;\:"
使用 DefineLanguageToken、RemoveLanguageToken 和 ClearLanguageTokens 命令添加和修改返回的语言。 SetLanguageName 和 LanguageName 也可能有用。
要从头开始构建新语言,请改用 CreateLanguage 命令。
另见: SetLocalizationLanguage、SaveLanguage、LocalizeString 和 LocalizeGadget.
Function SaveLanguage( language:TMaxGuiLanguage, url:Object )
描述: 将语言作为 INI 部分保存到提供的流。
信息: url 可以是文件路径或任何其他可写入的 TStream 对象。
如果 url 是以 "/" 或 "\" 结尾的字符串,则假定 url 是目录路径,并将附加默认文件名,如下所示
url = String(url) + LanguageName(language).Split(" ")[0] + ".language.ini"
警告: 此命令将自动覆盖提供的/生成的路径上的任何现有文件。
另见: LoadLanguage、SetLocalizationLanguage、LocalizeString 和 LocalizeGadget.
Function SetLanguageName( language:TMaxGuiLanguage, name$ )
描述: 重新定义语言的名称。
信息: 另见: LanguageName、LoadLanguage、CreateLanguage 和 SetLocalizationLanguage.
Function LanguageName$( language:TMaxGuiLanguage )
描述: 返回语言的名称。
信息: 另见: SetLanguageName、LoadLanguage、CreateLanguage 和 SetLocalizationLanguage.
Function DefineLanguageToken( language:TMaxGuiLanguage, token$, value$ )
描述: 为本地化令牌定义特定于语言的值。
信息: 本地化令牌不区分大小写,如果语言中已存在令牌定义,则令牌值将被此最新的 value$ 覆盖。
另见: LoadLanguage、CreateLanguage、SaveLanguage 和 SetLocalizationLanguage.
Function LanguageTokenDefinition$( language:TMaxGuiLanguage, token$ )
描述: 查找特定语言的令牌值。
信息: 本地化令牌不区分大小写,并且要么与语言一起加载,要么使用 DefineLanguageToken 命令定义。
如果在语言中找不到显式令牌定义,则返回 token$ 字符串,因为它被传递。
另见: LoadLanguage、CreateLanguage、SaveLanguage 和 SetLocalizationLanguage.
Function RemoveLanguageToken( language:TMaxGuiLanguage, token$ )
描述: 从语言中删除令牌定义。
信息: 唯一不能删除的令牌是 'LanguageID',因为每种语言都需要定义此令牌 - 它定义了语言名称。如果未定义匹配的令牌,则命令将静默返回。
注意: 本地化令牌不区分大小写,因此以下所有命令都请求删除相同的令牌
RemoveLanguageToken( language, "WelcomeMessage" ) RemoveLanguageToken( language, "WELCOMEMESSAGE" ) RemoveLanguageToken( language, "welcomemessage" ) RemoveLanguageToken( language, "WeLcOmEmEsSaGe" )
另见: ClearLanguageTokens、DefineLanguageToken、LoadLanguage、CreateLanguage、SaveLanguage 和 SetLocalizationLanguage.
Function ClearLanguageTokens( language:TMaxGuiLanguage )
描述: 删除语言中定义的所有令牌。
信息: 唯一不会被删除的令牌是 'LanguageID',因为每种语言都需要定义此令牌 - 它定义了语言名称。
另见: RemoveLanguageToken、DefineLanguageToken、LoadLanguage、CreateLanguage、SaveLanguage 和 SetLocalizationLanguage.
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$,就像它被传递时的样子(包括任何花括号)。
另请参阅:SetLocalizationMode、LocalizationMode、SetLocalizationLanguage 和 LocalizationLanguage。
SetLocalizationMode
[edit | edit source]Function SetLocalizationMode( mode:Int = LOCALIZATION_ON )
描述:启用或禁用本地化引擎,并设置其他本地化模式。
信息:该模式可以设置为
常量 | 含义 |
LOCALIZATION_OFF | 任何本地化的小部件将显示其 localizedtext$ 作为其实际文本。 |
LOCALIZATION_ON | 本地化小部件将使用当前语言来显示其文本。 |
这两种模式都可以与 LOCALIZATION_OVERRIDE 组合(按位或运算),这将导致小部件在创建时自动“本地化”,任何提供给 CreateGadget() 函数的 text$ 参数都被解释为本地化字符串。
如果任何窗口菜单已本地化,则可能需要在所有相关窗口上调用 UpdateWindowMenu 才能使文本更改可见。
另请参阅:LocalizationMode、SetLocalizationLanguage、LocalizationLanguage 和 LocalizeGadget。
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 才能使文本更改可见。
另请参阅:LocalizationLanguage、SetLocalizationMode、LocalizationMode 和 LocalizeString。
LocalizationLanguage
[edit | edit source]Function LocalizationLanguage:TMaxGUILanguage()
描述:返回 MaxGUI 的本地化系统使用的当前语言。
信息:使用 DefineLanguageToken、RemoveLanguageToken 和 ClearLanguageTokens 命令来添加和修改返回的语言。 SetLanguageName 和 LanguageName 也可能有用。
信息:另请参阅:SetLocalizationLanguage、SetLocalizationMode、LocalizationMode 和 LocalizeGadget。