REBOL [
    Title: "translate"
    Date: 23-Aug-2002/18:30:14+2:00
    Version: 1.0.0
    File: %translate.r
    Author: "Volker Nitsch"
    Purpose: "i18n-tool to translate rebol-scripts"
    Email: nc-nitschvo2@netcologne.de
    library: [
        level: 'intermediate
        platform: 'all
        type: 'Tool
        domain: [dialects GUI text-processing]
        tested-under: none
        support: none
        license: none
        see-also: none
    ]
]

prefs: context[
    source: %translate.r
    target: %translate-deutsch.r
    source-language: "english"
    target-language: "german"
    unknown: []
    known: to-hash["english" "englisch" "german" "deutsch" "translate" "uebersetze" "save" "speichern"
"there are doubles in translations." "Diesen String gibt es schon."
        {could be the same word in both languages. can break script. contine?}
{Koennte sein, das es den Text in beiden Sprachen gibt. Der Script koennte dadurch fehlerhaft werden. Trotzdem fortsetzen? }
"really delete this nice translation?" {Ooch. wirkklich diese huebsche uebersetzung loeschen?} ">known" ">bekannte"
 "edit script" "Editiere Script" "no editor installed" "kein Editor installiert." "ok" "Ja" "text missing" "Text fehlt" "delete"
"Loeschen" "this is present in script" "Das gibts schon im Script." "cancel" "Niicht!" ">unknown" ">unbekannte" "Debugger"
"Kammerjaeger"
 ]
    ;known: to-hash["english" "german" "wrong" "wrong"]
    this-file: %translate-prefs.r
    format: [translate-prefs 0.0.0]
]
save-prefs': does[save prefs/this-file make prefs[date: now]]
if exists? prefs/this-file[ prefs: make prefs last load/all prefs/this-file]
;delete prefs/this-file ;save-prefs'

translate: does[
    either found: find prefs/known string: first here [
        change/only here either odd? index? found[ found/2 ][ found/-1 ]
    ][
        append prefs/unknown string
    ]
]

reversible?: does[  equal? length? prefs/known length? unique copy prefs/known  ]

save-all: does[save-prefs' save prefs/target source' parse-and-view last-lay]

parse-and-view: func[lay][
if all[ not reversible?
    not confirm join "there are doubles in translations. "
    "could be the same word in both languages. can break script. contine?"
][return]
source': load/all prefs/source
clear prefs/unknown
parse source' rule: [ some[
    here:
    string! ( translate )
    | into rule
    | skip ()
]]
prefs/unknown: unique prefs/unknown
view center-face layout last-lay: lay
]

unknown-lay: [
    button ">known"[parse-and-view known-lay]
    button "save"[save-all]
    button "Debugger"[either exists? %ed.r[do %ed.r][alert "no editor installed"]]
    return text-list 550x400 data prefs/unknown[
        edit-translation reduce[first face/picked ""]
    ]
]
known-lay: [
    button ">unknown"[parse-and-view  unknown-lay]
    button "save"[save-all]
    return text-list 550x400 data foreach [s d] prefs/known copy/deep[append [] remold[s d] ][
        edit-translation load first face/picked
    ]
]
edit-translation: func[source-target][
view center-face layout [
    label prefs/source-language sf: info 550x100 first source-target
    label prefs/target-language tf: field 550x100  second source-target
    across button "ok"[
        if not any[
            if empty? sf/text[alert "text missing" 'cancel]
            if find prefs/known tf/text [alert "this is present in script" 'cancel]
        ][
            either found: find/tail prefs/known sf/text[
                change found tf/text
            ][
                repend prefs/known [sf/text tf/text]
            ]
        ]
        parse-and-view last-lay
    ]
    button "delete"[
        if confirm "really delete this nice translation?"[
            remove find prefs/known sf/text
            remove find prefs/known tf/text
        ]
        parse-and-view last-lay
    ]
    button "cancel"[parse-and-view last-lay]
]]

parse-and-view  unknown-lay