Monday, November 08, 2010 at 12:02 AM.
system.verbs.builtins.Frontier.getString
on getString (stringId, adrLanguageTable, adrReplacementTable=nil, defaultLanguageName=nil) {
<<Changes:
<<7/5/02; 3:51:37 AM by JES
<<Call through Frontier.getLocalizedObject to get the address of the string.
<<05/17/00; 7:45:29 PM by JES
<<optimized string finding code for about a 10% execution speed increase
<<05/01/00; 1:16:08 PM by JES
<<This is the bottleneck and place for optimization of all localized string lookups in Frontier.
<<stringId -- This is a partial address, dot-delimited, like "discuss.byLine" or whatever. (Strings are stored in a table hierarchy.)
<<adrLanguageTable -- This is the actual Frontier address of the language table to use.
<<adrReplacementTable -- This is the address of a replacement table. It contains name/value pairs, of course. The values are the localized strings.
<<defaultLanguageName -- the name of the language to fall back to if the lookup fails
<<For example, mainResponder has a default setting at config.mainResponder.globals.language, which is passed in if it exists.
<<on findString (adrLanguageTable, stringId)
<<gets a string, given the language table address and the stringId
<<on dive (adrLanguageTable, stringId) // takes a partial address, returns the address of a string, or false if not found
<<local (nomad = @adrLanguageTable^.strings, s)
<<loop
<<if not (stringId contains ".")
<<nomad = @nomad^.[stringId]
<<break
<<s = string.nthField (stringId, '.', 1)
<<nomad = @nomad^.[s]
<<if not defined (nomad^)
<<return (false)
<<stringId = string.delete (stringId, 1, sizeOf (s) + 1)
<<if defined (nomad^)
<<return (nomad)
<<return (false)
<<local (stringAdr = dive (adrLanguageTable, stringId))
<<if stringAdr // found it.
<<return (string (stringAdr^))
<<
<<Was there a default language passed in?
<<local (adrLanguagesTable = parentOf (adrLanguageTable^), defaultLanguage)
<<if defaultLanguageName // was there a default language passed in?
<<defaultLanguage = defaultLanguageName
<<if defined (adrLanguagesTable^.[defaultLanguage])
<<adrLanguageTable = @adrLanguagesTable^.[defaultLanguage]
<<stringAdr = dive (adrLanguageTable, stringId)
<<if stringAdr // found it.
<<return (string (stringAdr^))
<<
<<Is there a default language setting for Frontier that's different from the one passed in?
<<if defined (user.prefs.language) and (string.lower (user.prefs.language) != defaultLanguageName)
<<defaultLanguage = user.prefs.language
<<if defined (adrLanguagesTable^.[defaultLanguage])
<<adrLanguageTable = @adrLanguagesTable^.[defaultLanguage]
<<stringAdr = dive (adrLanguageTable, stringId)
<<if stringAdr // found it.
<<return (string (stringAdr^))
<<
<<only check for the English string if the default setting was something other than English
<<if string.lower (defaultLanguage) != "english"
<<if defined (adrLanguagesTable^.english)
<<adrLanguageTable = @adrLanguagesTable^.english
<<stringAdr = dive (adrLanguageTable, stringId)
<<if stringAdr // found it.
<<return (string (stringAdr^))
<<scriptError ("Could not find the translation string at '" + stringId + "'.")
local (s);
<<s = findString (adrLanguageTable, stringId)
local (adrstring);
if Frontier.getlocalizedObject ("strings." + stringId, adrLanguageTable, @adrstring, defaultLanguageName) {
s = string (adrstring^)}
else { //error
scriptError ("Could not find the translation string at '" + stringId + "'.")};
if adrReplacementTable != nil { // replace the bracketted items -- "[[name]]", "[[date]]", etc
if date.versionLessThan (Frontier.version (), "7.1b18") {
local (i = 1, adrReplacementItem);
for adrReplacementItem in adrReplacementTable {
s = string.replaceAll (s, "[[" + nameOf (adrReplacementItem^) + "]]", adrReplacementItem^, false)}}
else { //PBS 11/02/01: use string.multipleReplaceAll
s = string.multipleReplaceAll (s, adrReplacementTable, false, "[[", "]]")}};
return (s)};
bundle { //test code
bundle { //test
dialog.notify (getString ("weblogPostForm.postButton", @radio.data.localization.languages))}}
<<bundle //benchmark
<<local (t = clock.ticks ())
<<for i = 1 to 1000
<<getString ("weblogPostForm.postButton", @radio.data.localization.languages.english)
<<dialog.notify (clock.ticks () - t)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.