batch-editor.tcl
A quick and dirty batch editor for translation.
- Location:
- /packages/acs-lang/www/admin/batch-editor.tcl
- Author:
- Christian Hvid
Related Files
[ hide source ] | [ make this the default ]
File Contents
ad_page_contract { A quick and dirty batch editor for translation. @author Christian Hvid } { locale:word package_key:token {show "all"} {page_start 0} } # We rename to avoid conflict in queries set current_locale $locale set default_locale en_US set locale_label [lang::util::get_label $current_locale] set default_locale_label [lang::util::get_label $default_locale] set page_title "Batch edit messages" set context [list [list [export_vars -base package-list {locale}] $locale_label] \ [list [export_vars -base message-list {locale package_key show}] $package_key] \ $page_title] # TODO: PG ##### # # Handle filtering # ##### # LARS: The reason I implemented this overly complex way of doing it is that I was just about to # merge this page with messages-search ... set where_clauses [list] set keys_where_clauses [list] switch -exact $show { translated { lappend where_clauses {lm2.message is not null} lappend keys_where_clauses {exists (select 1 from lang_messages lm where lm.package_key = lmk.package_key and lm.message_key = lmk.message_key and lm.locale = :current_locale)} } untranslated { lappend where_clauses {lm2.message is null} lappend keys_where_clauses {not exists (select 1 from lang_messages lm where lm.package_key = lmk.package_key and lm.message_key = lmk.message_key and lm.locale = :current_locale)} } } set where_clause {} set keys_where_clause {} if { [llength $where_clauses] > 0 } { set where_clause "and [join $where_clauses "\n and "]" } if { [llength $keys_where_clauses] > 0 } { set keys_where_clause "and [join $keys_where_clauses "\n and "]" } ##### # # Counting messages # ##### db_1row counts { select (select count(*) from lang_messages where package_key = :package_key and locale = :locale) as num_translated, (select count(*) from lang_message_keys where package_key = :package_key) as num_messages from dual } set num_untranslated [expr {$num_messages - $num_translated}] set num_messages_pretty [lc_numeric $num_messages] set num_translated_pretty [lc_numeric $num_translated] set num_untranslated_pretty [lc_numeric $num_untranslated] ##### # # Initialize pagination # ##### set keys [db_list get_keys " select lmk.message_key from lang_message_keys lmk where lmk.package_key = :package_key $keys_where_clause order by upper(lmk.message_key), lmk.message_key "] set total [llength $keys] set page_end [expr {$page_start + 10}] ##### # # Build the form # ##### set edit_buttons [list] if { $show ne "untranslated" && $page_start > 0 } { lappend edit_buttons { "< Update and back" "prev" } } lappend edit_buttons { "Update" "ok" } if { $show ne "untranslated" && $page_end < $total } { lappend edit_buttons { "Update and next >" "next" } } ad_form -name batch_editor -edit_buttons $edit_buttons -form { {locale:text(hidden) {value $locale}} {package_key:text(hidden) {value $package_key}} {page_start:integer(hidden),optional} {show:text(hidden),optional} } # Each message has the following fields: # # message_key_x:text(hidden) # message_key_pretty_x:text(inform) # description_x:text(inform) # default_locale_message_x:text(textarea) # message_x:text(textarea) # org_message_x:text(hidden) set count $page_start array set sections {} db_foreach get_messages [subst -nocommands { select lm1.message_key, lm1.package_key, lm1.message as default_message, lm2.message as translated_message, lmk.description from lang_messages lm1 left outer join lang_messages lm2 on (lm2.locale = :locale and lm2.message_key = lm1.message_key and lm2.package_key = lm1.package_key), lang_message_keys lmk where lm1.locale = :default_locale and lm1.package_key = :package_key and lm1.message_key = lmk.message_key and lm1.package_key = lmk.package_key $where_clause order by upper(lm1.message_key), lm1.message_key offset :page_start fetch first 10 rows only }] { ad_form -extend -name batch_editor -form \ [list [list "message_key_$count:text(hidden)" {value $message_key}]] set message_url [export_vars -base edit-localized-message { locale package_key message_key show }] # Adding section set section_name "$package_key.$message_key" if { ![info exists sections($section_name)] } { set sec [list "-section" $section_name {legendtext "$section_name"}] ad_form -extend -name batch_editor -form [list $sec] set sections($section_name) "$section_name" } ad_form -extend -name batch_editor -form \ [list [list "message_key_pretty_$count:text(inform)" \ {label "Message Key"} \ {noquote} \ {value "<a href=\"[ns_quotehtml $message_url]\">$package_key.$message_key</a>"}]] if { $description ne "" } { set description_edit_url [export_vars -base edit-description { locale package_key message_key show }] set description "[ad_text_to_html -- $description] [subst { (<a href="[ns_quotehtml $description_edit_url]">edit</a>)}]" ad_form -extend -name batch_editor -form \ [list [list "description_$count:text(inform),optional" \ {label "Description"} \ {value $description}]] } if { $current_locale ne $default_locale } { ad_form -extend -name batch_editor -form \ [list [list "default_locale_message_$count:text(inform),optional" \ {label $default_locale_label} \ {value $default_message}]] } if { [string length $translated_message] > 80 } { set html { cols 80 rows 15 } } else { set html { cols 60 rows 2 } } ad_form -extend -name batch_editor -form \ [list [list "org_message_$count:text(hidden),optional"]] ad_form -extend -name batch_editor -form \ [list [list "message_$count:text(textarea),optional" {label $locale_label} {html $html}]] # We set this as a local variable, so that ad_form's normal system works set message_$count $translated_message incr count } ad_form -extend -name batch_editor -on_request { # Set from local vars } -on_submit { for { set i $page_start } { $i < $page_end && $i < $total } { incr i } { if { [set org_message_$i] ne [set message_$i] } { lang::message::register $current_locale $package_key \ [set message_key_$i] \ [set message_$i] } } set button [form::get_button batch_editor] if { $button ne "ok" } { switch $button { prev { set page_start [expr {$page_start - 10}] if { $page_start < 0 } { set page_start 0 } } next { incr page_start 10 if { $page_start > $total } { set page_start [expr {$total - ($total % 10)}] } } } } ad_returnredirect [export_vars -base [ad_conn url] { locale package_key show page_start }] ad_script_abort } ##### # # Slider for pagination # ##### multirow create pagination text hint url selected group for {set count 0} {$count < $total} {incr count 10 } { set end_page [expr {$count + 9}] if { $end_page > $total-1 } { set end_page [expr {$total-1}] } set text {} if { [string match "lt_*" [lindex $keys $count]] } { append text [string range [lindex $keys $count] 3 5] } else { append text [string range [lindex $keys $count] 0 2] } append text " - " if { [string match "lt_*" [lindex $keys $end_page]] } { append text [string range [lindex $keys $end_page] 3 5] } else { append text [string range [lindex $keys $end_page] 0 2] } multirow append pagination \ $text \ "[lindex $keys $count] - [lindex $keys $end_page]" \ [export_vars -base batch-editor { { page_start $count } locale package_key show }] \ [expr {$count == $page_start}] \ [expr {$count / 100}] } ##### # # Slider for 'show' options # ##### multirow create show_opts value label count multirow append show_opts "all" "All" $num_messages_pretty multirow append show_opts "translated" "Translated" $num_translated_pretty multirow append show_opts "untranslated" "Untranslated" $num_untranslated_pretty multirow extend show_opts url selected_p multirow foreach show_opts { set selected_p [string equal $show $value] if {$value eq "all"} { set url [export_vars -base [ad_conn url] { locale package_key }] } else { set url [export_vars -base [ad_conn url] { locale package_key {show $value} }] } } # Local variables: # mode: tcl # tcl-indent-level: 4 # indent-tabs-mode: nil # End: