Index: openacs-4/packages/acs-lang/tcl/lang-util-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-lang/tcl/lang-util-procs.tcl,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/acs-lang/tcl/lang-util-procs.tcl 7 Oct 2002 14:32:46 -0000 1.1 +++ openacs-4/packages/acs-lang/tcl/lang-util-procs.tcl 9 Oct 2002 16:05:57 -0000 1.2 @@ -13,6 +13,7 @@ @author Bruno Mattarollo (bruno.mattarollo@ams.greenpeace.org) @author Peter Marklund (peter@collaboraid.biz) @author Lars Pind (lars@collaboraid.biz) + @author Christian Hvid @cvs-id $Id$ } @@ -120,17 +121,18 @@ return $indices_list } - ad_proc extract_keys_from_adps { adp_files } { + ad_proc replace_adp_message_tags_with_lookups { adp_files } { Modify the given adp templates by replacing occurencies of <#package_key.message_key Some en_US text#> with #package_key.message_key# and create entries in the file $package_root/catalog/$package_key.en_US.iso-8859-1.cat for - each of these keys. + each of these keys. Returns the number of replacements done. @author Peter marklund (peter@collaboraid.biz) } { + set number_of_replacements "0" # First open the catalog file of the package to add new message keys to if { [llength $adp_files] > 0 } { @@ -147,17 +149,20 @@ set catalog_file_path "$catalog_dir/$package_key.en_US.iso-8859-1.cat" ns_log Notice "lang_extract_keys_from_adps: opening catalog file $catalog_file_path for writing" set catalog_file_id [open "$catalog_file_path" a+] - # The file may not end in a new line so add one - puts $catalog_file_id "\n" + + # Use the original catalog file contents to determine if a key should + # be added to the catalog file or not + set original_catalog_file_contents [read $catalog_file_id] + + if { ![regexp {\n$} $original_catalog_file_contents match] } { + # The file does not end in a new line so add one + puts $catalog_file_id "\n" + } } else { # No files to process so return return } - # Use the original catalog file contents to determine if a key should - # be added to the catalog file or not - set original_catalog_file_contents [read $catalog_file_id] - # Keep track of the messages added to the catalog file array set added_catalog_messages {} @@ -186,6 +191,8 @@ set message_key_indices [lang::util::get_adp_message_indices $file_contents] foreach index_pair $message_key_indices { + incr number_of_replacements + set tag_start_idx [lindex $index_pair 0] set tag_end_idx [lindex $index_pair 1] set message_tag "[string range $file_contents $tag_start_idx $tag_end_idx]" @@ -244,6 +251,8 @@ if { [info exists catalog_file_id] } { close $catalog_file_id } + + return $number_of_replacements } ad_proc -private get_unique_key_to_add_to_catalog_file { @@ -369,6 +378,157 @@ } + ad_proc -private remove_gt_lt { + s + } { + Removes < > and replaces them with < > + } { + regsub -all "<" $s {\<} s + regsub -all ">" $s {\>} s + return $s + } + + + ad_proc -public replace_adp_text_with_message_tags { + file_name + mode + {keys {}} + + } { + Prepares an .adp-file for localization by inserting temporary hash-tags + around text strings that looks like unlocalized plain text. Needless to say + this is a little shaky so not all plain text is caught and the script may insert + hash-tags around stuff that should not be localized. It is conservative though. + + There are two modes the script can be run in: + + - report : do *not* write changes to the file but return a report with suggested changes. + + - write : write changes in the file - it expects a list of keys and will insert them + in the order implied by the report - a report is also returned. + + The report is list of two lists: The first being a list of pairs (key, text with context) + and the second is a list of suspious looking garbage. In report mode the keys are suggested + keys and in write mode the keys are the keys supplied in the keys parameter. + + @author Christian Hvid + @author Jeff Davis + + } { + set state text + set out {} + + set report [list] + set garbage [list] + + set n 0 + + # open file and read its content + + set fp [open $file_name "r"] + set s [read $fp] + close $fp + + #ns_write "input== s=[string range $s 0 600]\n" + set x {} + while {![empty_string_p $s] && $n < 1000} { + if { $state == "text" } { + + # clip non tag stuff + if {![regexp {(^[^<]*?)(<.*)$} $s match text s x]} { + set text $s + set s {} + } + + # make sure the string is non empty and contains at least one letter. + if {![empty_string_p $text] + && ![string is space $text] + && [string match -nocase {*[A-Z]*} $text] + && ![regexp {^\s*@[A-Za-z_.-]*@\s*$} $text] + && ![string match {* *} $text] + && ![string match {*@*} $text] + && ![string match {*\#*} $text] + && ![string match {*\{*} $text] + && ![string match {*\}*} $text] + && [string length $text] > 1 + } { + regexp {^(\s*)(.*?)(\s*)$} $text match lead text lag + + if { $mode == "report" } { + # create a key for the text + + regsub -all " " $text "_" key + # Do not allow . in the key as dot is used as a separator to qualify a key + # with the package key. The prepending with package key is done at a later + # stage + regsub -all {[^-a-zA-Z0-9_]} $key "" key + + # is this key too long? + + if { [string length $key] > 20 } { + set key "lt_[string range $key 0 20]" + } + + lappend report [list $key "[string range [remove_gt_lt $out$lead] end-20 end]$text[string range [remove_gt_lt $lag$s] 0 20]" ] + } else { + if { [lindex $keys $n] != "" } { + lappend report [list [lindex $keys $n] "[string range [remove_gt_lt $out$lead] end-20 end]$text[string range [remove_gt_lt $lag$s] 0 20]" ] + append out "$lead<\#[lindex $keys $n] $text\#>$lag" + } else { + lappend garbage "[string range [remove_gt_lt $out$lead] end-20 end]$text [string range [remove_gt_lt $lag$s] 0 20]" + append out "$lead$text$lag" + } + } + + incr n + + } else { + # this was not something we should localize + + append out $text + + # but this maybe something that should be localized by hand + + if { ![string match {*\#*} $text] && ![string is space $text] && [string match -nocase {*[A-Z]*} $text] && ![regexp {^\s*@[^@]+@\s*$} $text] } { + + # log a comment on it and make a short version of the text that is easier to read + + regsub -all "\n" $text "" short_text + + set short_text [string range $short_text 0 40] + + lappend garbage "$short_text" + + } + + } + set state tag + + } elseif { $state == "tag"} { + if {![regexp {(^<[^>]*?>)(.*)$} $s match tag s]} { + set s {} + } + append out $tag + set state text + + } + } + + if { $mode == "write" } { + if { $n > 0 } { + # backup original file - fail silently if backup already exists + + if { [catch {file copy $file_name $file_name.orig}] } { } + + set fp [open $file_name "w"] + puts $fp $out + close $fp + } + } + + return [list $report $garbage] + } + } #####