summaryrefslogtreecommitdiffstats
path: root/src/locale.inc
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale.inc')
-rw-r--r--src/locale.inc267
1 files changed, 267 insertions, 0 deletions
diff --git a/src/locale.inc b/src/locale.inc
new file mode 100644
index 0000000..cfd07c1
--- /dev/null
+++ b/src/locale.inc
@@ -0,0 +1,267 @@
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+%
+% Handle translations.
+%
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Set language.
+%
+% ( locale ) ==> ( true|false )
+%
+/setlang {
+ config.lang over eq { pop false return } if
+
+ /config.lang exch def
+
+ /config.rtl config.lang lang.getrtl def
+
+ % clear old help texts
+ /help.messages xfree
+
+ translation.texts {
+ translation.texts dup { free } forall free
+ /translation.texts .undef def
+ } if
+
+ findtexts
+
+ true
+} def
+
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Set keyboard map.
+%
+% ( locale|keymap ) ==> ( )
+%
+/setkeymap {
+ config.keymap.name over eq { pop return } if
+ /config.keymap.name exch def
+
+ config.keymap.id config.keymap.name eq { return } if
+
+ /config.keymap .undef def
+ /config.keymap.id .undef def
+
+ keymaps {
+ dup .km.id get config.keymap.name eq
+ over .km.locale get config.keymap.name eq or {
+ dup .km.map get /config.keymap exch def
+ .km.id get /config.keymap.id exch def
+ } { pop } ifelse
+ } forall
+
+ config.keymap.id .undef eq {
+ keymaps {
+ dup .km.locale get config.keymap.name locale.cmp {
+ dup .km.map get /config.keymap exch def
+ .km.id get /config.keymap.id exch def
+ } { pop } ifelse
+ } forall
+ } if
+
+ config.keymap.id .undef eq {
+ /config.keymap.id "en_US" def
+ } if
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Look up keymap in languale locale list.
+%
+% ( locale ) ==> ( keymap|locale )
+%
+/getkeymapfromlocale {
+ /kbd.tmp exch def
+ /kbd.tmp.locale .undef def
+
+ lang.defaultnames {
+ dup .la.locale get kbd.tmp eq { .la.keymap get /kbd.tmp.locale exch def exit } { pop } ifelse
+ } forall
+
+ kbd.tmp.locale .undef eq {
+ lang.defaultnames {
+ dup .la.locale get kbd.tmp locale.cmp { .la.keymap get /kbd.tmp.locale exch def exit } { pop } ifelse
+ } forall
+ } if
+
+ kbd.tmp.locale .undef ne { /kbd.tmp kbd.tmp.locale def } if
+
+ kbd.tmp
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Set texts for current language.
+%
+% ( ) ==> ( )
+%
+/findtexts {
+ /locale.texts afree
+ /locale.texts config.lang "%s.tr" loadtexts def
+
+ 0 texts {
+ over locale.texts exch aget dup .undef eq { pop "No Texts!" } if def
+ 1 add
+ } forall
+ pop
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Load texts for current language.
+%
+% ( str1 str2 -- array1 )
+%
+% str1: locale
+% str2: file name template (like "foo.%s")
+% array1: array with texts (empty if no file was found)
+%
+/loadtexts {
+ locale.findfile
+ dup .undef eq { pop "en_US" "%s.tr" locale.findfile } if
+ dup .undef eq { pop [ ] return } if
+
+ /ft.len over length def
+ /ft.str over cvs def
+ /ft.pos 0 def
+
+ [
+ {
+ ft.pos ft.str length add ft.len lt {
+ ft.str strdup
+ /ft.str ft.str dup length 1 add /ft.pos over ft.pos add def add def
+ } {
+ exit
+ } ifelse
+ } loop
+ ]
+
+ exch free
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Translate menu entry.
+%
+% ( text ) ==> ( text )
+%
+/translate {
+ translations.init
+
+ translation.texts length 2 lt { return } if
+
+ 0 2 translation.texts length -2 and 1 sub {
+ translation.texts over get 2 index eq {
+ 1 add translation.texts exch get exch pop exit
+ } { pop } ifelse
+ } for
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Read menu translations.
+%
+% ( ) ==> ( )
+%
+/translations.init {
+ translation.texts { return } if
+
+ /translation.texts [ ] def
+
+ config.lang .undef eq { return } if
+
+ config.lang "translations.%s" locale.findfile dup {
+
+ /la.tmp.datalen over length def
+ /la.tmp.str exch cvs def
+
+ la.tmp.datalen 0 eq { return } if
+ la.tmp.str la.tmp.datalen 1 sub get '\n' ne { return } if
+
+ '\n' seteotchar
+
+ /translation.texts [
+
+ /la.tmp.len 0 def
+
+ {
+ la.tmp.str la.tmp.len add strdup
+ dup dup length 0 put
+ /la.tmp.len over length 1 add la.tmp.len add def
+
+ la.tmp.len la.tmp.datalen ge { exit } if
+
+ } loop
+
+ ] def
+
+ 0 seteotchar
+ } { pop } ifelse
+
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Read locale-specific file.
+%
+% ( str1 str2 -- ptr1 )
+%
+% str1: locale
+% str2: file name template (like "foo.%s")
+% ptr1: buffer with file data (or .undef)
+%
+/locale.findfile {
+ over length over length add string
+
+ rot strdup rot
+
+ over over 4 index sprintf 2 index findfile
+
+ dup .undef eq {
+ pop
+ exch
+ dup "_" strstr dup {
+ 1 sub
+ over exch 0 put
+ exch
+ over over 4 index sprintf 2 index findfile
+ } {
+ pop exch .undef
+ } ifelse
+ } if
+
+ exch pop exch free exch free
+} def
+
+
+% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+% Compare two locale names.
+%
+% ( str1 str2 -- int1 )
+%
+% str1: locale1
+% str2: locale2
+% int1: 0 = no match, 1 = loose match, 2 = identical
+%
+/locale.cmp {
+ over over eq { pop pop 2 return } if
+
+ currenteotchar '_' seteotchar
+
+ rot strdup rot strdup
+
+ over over eq rot free exch free
+
+ exch seteotchar
+
+ { 1 } { 0 } ifelse
+} def
+
+