#!yab doc Author: Jan Bungeroth doc (c) 2011 in terms of the Artistic License doc doc The Localizer helps you to localize your yab applications doc and import old Zeta localizations. localize "x-vnd.Localizer" INSTALLPATH$ = "/boot/common/data/locale/catalogs" mime$ = "x-vnd." lastdir$ = "/boot/home" targetLang$ = "" OpenMainWindow() MainMessageLoop() CloseWindows() sub MainMessageLoop() local finished, i, j, n, selected, tmp local tmp$, t$ dim msg$(1) while(not finished) n = split(message$, msg$(), "|") for i = 1 to n // if(msg$(i) <> "") print msg$(i) // menu switch(msg$(i)) case menu translate$("MainWindow:File:New...") NewLocale() break case menu translate$("MainWindow:File:Open...") OpenLocale() break case menu translate$("MainWindow:File:Import ZETA...") ImportZETA() break case menu translate$("MainWindow:File:Save...") if(SaveLocale()) then alert translate$("Saving catalog completed.\n\nSaved to ") + lastdir$, "Ok", "info" endif break case menu translate$("MainWindow:File:Save and Install...") if(SaveLocale()) then InstallLocale() endif break case menu translate$("MainWindow:File:Quit") case "MainWindow:_QuitRequested" case "_QuitRequested" finished = true break case menu translate$("MainWindow:Help:Help...") Help() break case menu translate$("MainWindow:Help:About...") About() break end switch // textcontrols if(left$(msg$(i), 6) = "AddSrc") then tmp$ = right$(msg$(i), len(msg$(i)) - 7) selected = 0 for j = 1 to listbox count "SrcList" t$ = listbox get$ "SrcList", j if(t$ = tmp$) then selected = j break endif next j if(selected = 0) then localize stop listbox add "SrcList", tmp$ localize selected = listbox count "SrcList" endif listbox select "SrcList", selected if(listbox count "TgtList" >= selected) then listbox select "TgtList", selected else listbox select "TgtList", 0 endif end if if(left$(msg$(i), 6) = "AddTgt") then listbox add "TgtList", right$(msg$(i), len(msg$(i)) - 7) selected = listbox count "TgtList" listbox select "TgtList", selected if(listbox count "SrcList" >= selected) then listbox select "SrcList", selected else listbox select "SrcList", 0 endif end if if(left$(msg$(i), 4) = "Mime") then mime$ = right$(msg$(i), len(msg$(i)) - 5) end if // listboxes if(left$(msg$(i), 7) = "SrcList") then selected = val(right$(msg$(i), len(msg$(i)) - 16)) if(listbox count "TgtList" >= selected) then listbox select "TgtList", selected else listbox select "TgtList", 0 end if end if if(left$(msg$(i), 7) = "TgtList") then selected = val(right$(msg$(i), len(msg$(i)) - 16)) if(listbox count "SrcList" >= selected) then listbox select "SrcList", selected else listbox select "SrcList", 0 end if end if if(mid$(msg$(i), 9, 7) = "_Invoke") then OpenEditor(msg$(i)) end if next i wend end sub sub OpenMainWindow() local h, w h = peek("desktopheight") - 200 w = peek("desktopwidth") - 400 window open 200, 100 to w + 200, h + 100, "MainWindow", "Localizer" window set "MainWindow", "minimumto", 100,100 menu "File", "New...", "N", "MainWindow" menu "File", "Open...", "O", "MainWindow" menu "File", "Import ZETA...", "Z", "MainWindow" menu "File", "--", "", "MainWindow" menu "File", "Save...", "S", "MainWindow" menu "File", "Save and Install...", "I", "MainWindow" menu "File", "--", "", "MainWindow" menu "File", "Quit", "Q", "MainWindow" menu "Help", "Help...", "H", "MainWindow" menu "Help", "--", "", "MainWindow" menu "Help", "About...", "", "MainWindow" layout "top, left, right", "MainWindow" textcontrol 10,30 to w-20,55, "Mime", "Mime Type", mime$, "MainWindow" layout "top, bottom, left, right", "MainWindow" splitview 0,65 to w,h, "Split", true, true, "MainWindow" layout "top, left", "Split1" text 10,10, "EngText", "English Source", "Split1" layout "top, bottom, left, right", "Split1" listbox 10,30 to w/2 - 10,h-125, "SrcList", 3, "Split1" layout "bottom, left", "Split1" text 10,h-115, "AddEngText", "Add Phrase", "Split1" layout "top, left, right", "Split2" textcontrol 10, 4 to w/2-20, 25, "TgtLang", "Target Language Code", targetLang$, "Split2" layout "top, bottom, left, right", "Split2" listbox 10,30 to w/2 - 20,h-125, "TgtList", 3, "Split2" layout "bottom, left", "MainWindow" text 10,h-115, "AddTgtText", "Add Phrase", "Split2" layout "bottom, left, right", "Split1" textcontrol 10,h-100 to w/2 - 20, h-80, "AddSrc", "", "", "Split1" layout "bottom, left, right", "MainWindow" textcontrol 10,h-100 to w/2-20, h-80, "AddTgt", "", "", "Split2" end sub sub CloseWindows() window close "MainWindow" end sub sub OpenEditor(msg$) local h, w, pos local entry$, list$, t$ local editorFinished, i, n h = peek("desktopheight") / 2 w = peek("desktopwidth") / 2 window open w-300,h - 40 to w+300,h+40, "EditorWindow", "" window set "EditorWindow", "look", "bordered" window set "EditorWindow", "feel", "modal-app" pos = val(right$(msg$, len(msg$)-16)) list$ = left$(msg$, 7) entry$ = listbox get$ list$, pos localize stop textcontrol 10,10 to 580,35, "Editor", "", entry$, "EditorWindow" localize button 300,40 to 390,70, "Cancel", "Cancel", "EditorWindow" button 400,40 to 490,70, "Delete", "Delete", "EditorWindow" button 500,40 to 590,70, "Commit", "Commit", "EditorWindow" option set "Editor", "Focus", true dim editorMsg$(1) editorFinished = false while(not editorFinished) n = split(message$, editorMsg$(), "|") for i = 1 to n if(editorMsg$(i) = "_QuitRequested") exit(1) if(editorMsg$(i) = "Cancel") editorFinished = true if(editorMsg$(i) = "Commit") then listbox remove list$, pos t$ = textcontrol get$ "Editor" localize stop listbox add list$, pos, t$ localize listbox select list$, pos editorFinished = true endif if(editorMsg$(i) = "Delete") then listbox remove list$, pos listbox select list$, 0 editorFinished = true endif next i wend window close "EditorWindow" end sub sub NewLocale() local selected selected = alert "All existing data will be lost!\n\nAre you sure?", "Yes", "No", "", "warning" if(selected = 1) then ClearAll() endif end sub sub OpenLocale() local readno, n local line$ file$ = filepanel "load-file", "Open Catalog", lastdir$ if(file$ = "") return ClearAll() lastdir$ = left$(file$, rinstr(file$, "/")) readno = open(file$, "r") if(readno = 0) then alert translate$("Error reading file\n") + peek$("error"), "Ok", "stop" return endif line input #readno line$ dim tabs$(1) n = split(line$, tabs$(), "\t") if(n <> 4) then alert "Error reading file\n", "Ok", "stop" close(readno) return endif if(tabs$(2) <> "english") then targetLang$ = tabs$(2) else targetLang$ = "" endif mime$ = tabs$(3) textcontrol set "TgtLang", targetLang$ textcontrol set "Mime", mime$ while(not eof(readno)) line input #readno line$ n = split(line$, tabs$(), "\t") if(n <> 4) then alert "Error reading file\n", "Ok", "stop" close(readno) return endif localize stop listbox add "SrcList", tabs$(1) localize if(targetLang$ <> "") then listbox add "TgtList", tabs$(4) endif wend close(readno) end sub sub ClearAll() listbox clear "SrcList" listbox clear "TgtList" textcontrol clear "AddSrc" textcontrol clear "AddTgt" mime$ = "x-vnd." textcontrol set "Mime", mime$ end sub sub ImportZETA() local file$, line$ file$ = filepanel "load-file", "Import ZETA Locale", lastdir$ if(file$ <> "") then ClearAll() lastdir$ = left$(file$, rinstr(file$, "/")) open file$ for reading as #1 while(not eof(#1)) line input #1 line$ ParseZETA(line$) wend close #1 file$ = right$(file$, len(file$) - rinstr(file$, "/")) if(lower$(right$(file$,2)) = mid$(file$,len(file$)-3,2)) then targetLang$ = lower$(right$(file$,2)) else targetLang$ = mid$(file$,len(file$)-3,2) + "_" + lower$(right$(file$,2)) endif textcontrol set "TgtLang", targetLang$ mime$ = "x-vnd." + left$(file$, instr(file$, ".") - 1) textcontrol set "Mime", mime$ if(warnDuplicates) then warnDulicates = false alert "Duplicate source lines were skipped.", "Ok", "warning" endif endif end sub sub ParseZETA(line$) local i, counter local a$, b$, m$ line$ = trim$(line$) if(left$(line$,1) <> "#") then counter = 0 for i = 1 to len(line$) m$ = mid$(line$, i, 1) if(m$ = chr$(34) and (mid$(line$, i-1, 1) <> chr$(92))) then counter = counter + 1 endif if(counter = 1) a$ = a$ + m$ if(counter = 3) b$ = b$ + m$ next i if(trim$(a$) <> "") then a$ = right$(a$, len(a$) - 1) b$ = right$(b$, len(b$) - 1) if(a$ = "_key") then if(IsUnique(b$)) then localize stop listbox add "SrcList", b$ localize else warnDuplicates = true endif elsif(a$ = "_value") then listbox add "TgtList", b$ else if(IsUnique(a$)) then localize stop listbox add "SrcList", a$ localize listbox add "TgtList", b$ else warnDuplicates = true endif endif endif endif end sub sub IsUnique(entry$) local i local t$ for i = 1 to listbox count "SrcList" t$ = listbox get$ "SrcList", i if(t$ = entry$) return false next i return true end sub sub SaveLocale() local fileno, i, writerno, n local entry$, file$, saveFile$ targetLang$ = textcontrol get$ "TgtLang" if(targetLang$ <> "") then saveFile$ = targetLang$ + ".catalog" else saveFile$ = "en.catalog" endif dir$ = filepanel "Save-File", "Save Catalog", lastdir$, saveFile$ if(dir$ = "") return false lastdir$ = left$(dir$, rinstr(dir$, "/") - 1) mime$ = textcontrol get$ "Mime" if(mime$ = "" or mime$ = "x-vnd.") then alert "Mime type invalid.\n\nA valid mime type has the form:\nx-vnd.ApplicationName", "Ok", "warning" return false endif file$ = right$(mime$, len(mime$) - instr(mime$, ".")) fileno = open(file$ + ".tmp", "w") if(fileno = 0) then alert translate$("Error writing file\n") + peek$("error"), "Ok", "stop" return false endif for i = 1 to listbox count "SrcList" entry$ = listbox get$ "SrcList", i entry$ = "B_CATKEY\"" + entry$ + "\"" print #fileno entry$ next i close fileno system("collectcatkeys -l english -s " + mime$ + " " + file$ + ".tmp") fileno = open(file$ + ".catkeys", "r") if(targetLang$ <> "") then writerno = open(lastdir$ + "/en.catalog", "w") else writerno = open(dir$, "w") endif if(fileno = 0 or writerno = 0) then alert translate$("Error reading or writing file\n") + peek$("error"), "Ok", "stop" return false endif line input #fileno entry$ dim tabs$(1) n = split(entry$, tabs$(), "\t") if(n <> 4) then alert "Error reading file\n", "Ok", "stop" close(writerno) close(fileno) return false endif print #writerno tabs$(1) + "\tenglish\t" + tabs$(3) + "\t" + tabs$(4) for i = 1 to listbox count "SrcList" entry$ = listbox get$ "SrcList", i print #writerno entry$ + "\t\t\t" + entry$ next i close(writerno) close(fileno) system("rm " + file$ + ".catkeys") if(targetLang$ <> "") then fileno = open(lastdir$ + "/en.catalog", "r") writerno = open(dir$, "w") if(fileno = 0 or writerno = 0) then alert translate$("Error reading or writing file\n") + peek$("error"), "Ok", "stop" return false endif line input #fileno entry$ dim tabs$(1) n = split(entry$, tabs$(), "\t") if(n <> 4) then alert "Error reading file\n", "Ok", "stop" close(writerno) close(fileno) return false endif print #writerno tabs$(1) + "\t" + targetLang$ + "\t" + tabs$(3) + "\t" + tabs$(4) i = 1 while(not eof(fileno)) line input #fileno entry$ n = split(entry$, tabs$(), "\t") if(n <> 4) then alert "Error reading file\n", "Ok", "stop" close(writerno) close(fileno) return false endif print #writerno tabs$(1) + "\t\t\t" + GetTarget$(tabs$(1)) i = i + 1 wend close(writerno) close(fileno) else alert "No target language specified.\nOnly the English catalog was generated.", "Ok", "warning" endif system("rm " + file$ + ".tmp") return true end sub sub InstallLocale() local inst$ inst$ = INSTALLPATH$ + "/" + mime$ system("mkdir -p " + inst$) if(targetLang$ <> "") then system("linkcatkeys -l english -s "+mime$+" -o "+inst$+"/en.catalog "+lastdir$+"/en.catalog") system("linkcatkeys -l "+targetLang$+" -s "+mime$+" -o "+inst$+"/"+targetLang$+".catalog "+dir$) else system("linkcatkeys -l english -s "+mime$+" -o "+inst$+"/en.catalog "+dir$) endif alert "Catalogs saved and installed.", "Ok", "info" end sub sub GetTarget$(source$) local t$ local i for i = 1 to listbox count "SrcList" t$ = listbox get$ "SrcList", i if(t$ = source$) then if(i <= listbox count "TgtList") then return listbox get$ "TgtList", i else return "" endif endif next i return "" end sub sub About() alert "Localizer for Haiku\n\n2011 by Jan Bungeroth", "Ok", "idea" end sub sub Help() local w,h, helpFinished, i, n, currentPage, maxPages h = peek("desktopheight") w = peek("desktopwidth") window open w/2-200,150 to w/2+200,h-150, "HelpWindow", "Help" window set "HelpWindow", "Flags", "not-zoomable, not-resizable" view 0,0 to 400,h-350, "HelpText", "HelpWindow" draw set "bgcolor", 255,255,255, "HelpText" draw set "highcolor", "Panel-Background-Color, Lighten-1-Tint", "HelpWindow" draw line 0,h-347 to 400,h-347, "HelpWindow" draw set "highcolor", "Panel-Background-Color, Darken-1-Tint", "HelpWindow" draw line 0,h-348 to 400,h-348, "HelpWindow" button 10,h-340 to 40,h-310, "HelpBack", "\xe2\x86\xa9", "HelpWindow" option set "HelpBack", "enabled", false button 360,h-340 to 390,h-310, "HelpForward", "\xe2\x86\xaa", "HelpWindow" button 120,h-340 to 280,h-310, "HelpClose", "Close", "HelpWindow" textedit 0,0 to 400,h-350, "Help", 1, "HelpText" textedit set "Help", "editable", false restore Pages read maxPages currentPage = 1 ShowHelpPage(currentPage) dim helpMsg$(1) helpFinished = false while(not helpFinished) n = split(message$, helpMsg$(), "|") for i = 1 to n switch(helpMsg$(i)) case "_QuitRequested" exit(0) break case "HelpWindow:_QuitRequested" case "HelpClose" helpFinished = true break case "HelpForward" if(currentPage < maxPages) then currentPage = currentPage + 1 ShowHelpPage(currentPage) if(currentPage = maxPages) option set "HelpForward", "enabled", false if(currentPage = 2) option set "HelpBack", "enabled", true endif break case "HelpBack" if(currentPage > 1) then currentPage = currentPage - 1 ShowHelpPage(currentPage) if(currentPage = 1) option set "HelpBack", "enabled", false if(currentPage = maxPages - 1) option set "HelpForward", "enabled", true endif break end switch next i wend window close "HelpWindow" end sub sub ShowHelpPage(num) local lines, i local line$ textedit clear "Help" restore "Page" + str$(num) read lines for i = 1 to lines read line$ textedit add "Help", translate$(line$) next i end sub // Help pages label Pages data 4 label Page1 data 9 // data lines for this page data "Localizer helps you to bring localization to your Haiku applications.\n\n" data "Localization is done using special catalog files. These catalog files are then compiled into BMessages and stored in a specific directory. The directory and the catalog files are signed by an application mimetype.\n\n" data "How to use Localizer:\n\n" data "1. Add the English strings of your program to the left list and their translations into the right list.\n\n" data "2. Enter the translation short code for the target language and the mimetype of your program.\n\n" data "3. 'Save and Install' will save your translations locally and install their compiled version to /boot/common/data/locale/catalogs\n\n" data "Make sure, both lists are also in sync!\n\n" data "The language code consists of a two letter country code (e.g. de for Germany or nl for Netherlands) or a combined code if the language code differs from the country code (e.g. nl_be for Dutch in Belgium).\n\n" data "The mimetype identifies the application. An application mimetype usually has the format: x-vnd.ApplicationName" label Page2 data 9 data "Importing ZETA locale files:\n\n" data "Localizer allows you to import old ZETA locale files.\n\n" data "Currently Localizer does feature context support, so all source strings are allowed only once. If there are several equal English strings in the ZETA file, only the first one is imported. The others are ignored.\n\n" data "Localizer supports ZETA files using the format:\n" data " \"English string\" \"Target string\"\n\n" data "And also this format:\n" data " \"_key\" = \"English string\"\n" data " \"_value\" = \"Target string\"\n" data "(Note: _key and _value need to be on separate lines.)" label Page3 data 7 data "How to use localization in yab programs:\n\n" data "First you have to load the locale catalog with the mimetype name:\n localize \"x-vnd.MyApplication\"\n\n" data "All widgets will now automatically translate all their strings.\n\n" data "To translate a specific string use:\n translate$(myString$)\n\n" data "To translate a string separated with colons : use:\n menu translate$(myString$)\nThis is useful for translating menu entries because menu messages are separated with :\n\n" data "A new feature allows you to turn the automatic translation of widget strings off and on again.\n" data "To turn the automatic translation off, use:\n localize stop\n\n" data "To turn it on again, use:\n localize" label Page4 data 5 data "How to use localization in C++ programs:\n\n" data "First, include Catalog.h and Locale.h:\n #include \n #include \n\n" data "Within your code, now you can simply translate a string with:\n B_TRANSLATE(myString);\n\n" data "The locale kit will search for the catalog files associated with your application's signature mimetype.\n\n" data "To link your program, add the locale and localestub libraries:\n -l locale -l localestub"