texlive[48955] Master: Refactoring, multiple repositories,

commits+siepo at tug.org commits+siepo at tug.org
Sat Oct 20 11:17:48 CEST 2018


Revision: 48955
          http://tug.org/svn/texlive?view=revision&revision=48955
Author:   siepo
Date:     2018-10-20 11:17:47 +0200 (Sat, 20 Oct 2018)
Log Message:
-----------
Refactoring, multiple repositories, localization

Modified Paths:
--------------
    trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl
    trunk/Master/tlpkg/bin/tl-update-messages
    trunk/Master/tlpkg/installer/install-tl-gui.tcl
    trunk/Master/tlpkg/installer/install-tl-windows.cmd
    trunk/Master/tlpkg/installer/install-tl.sh
    trunk/Master/tlpkg/translations/nl.msg
    trunk/Master/tlpkg/translations/nl.po

Added Paths:
-----------
    trunk/Master/tlpkg/TeXLive/tltcl.tcl

Modified: trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl
===================================================================
--- trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl	2018-10-20 09:17:47 UTC (rev 48955)
@@ -7,40 +7,38 @@
 
 package require Tk
 
-# searchpath:
+# security: disable send
+catch {rename send {}}
+
+# declarations and utilities shared with install-tl-gui.tcl
+set ::instroot [exec kpsewhich -var-value=TEXMFROOT]
+source [file join $::instroot "tlpkg" "TeXLive" "tltcl.tcl"]
+
+# searchpath and locale:
 # windows: most scripts run via [w]runscript, which adjusts the searchpath
-# for the current process.
-# unix/linux: tlshell.tcl should  be run via a symlink in a directory
+# for the current process. The provided tcl/tk can set locale on the fly.
+# unix/linux:
+# we may need to run tlshell.tcl via a wrapper in order to
+# make localization work right for tcl/tk version 8.5 and on macos.
+# tlshell.[sh|tcl] should  be run via a symlink in a directory
 # which also contains (a symlink to) kpsewhich.
 # This directory will be prepended to the searchpath.
 # kpsewhich will disentangle symlinks.
 
-# dis/enable restore dialog
+# dis/enable the restore dialog
 set do_restore 0
+
+# tlcontrib
+set tlcontrib "http://contrib.texlive.info/current"
+
 # dis/enable debug output (only for private development purposes)
 set ddebug 0
 
 ##### general housekeeping ############################################
 
-# security: disable send
-catch {rename send {}}
-
 # menus: disable tearoff feature
 option add *Menu.tearOff 0
 
-# no bold text for messages
-option add *Dialog.msg.font TkDefaultFont userDefault
-
-## italicized items; not used
-#font create it_font {*}[font configure TkDefaultFont]
-#font configure it_font -slant italic
-
-set plain_unix 0
-if {$::tcl_platform(platform) eq "unix" && \
-        $::tcl_platform(os) ne "Darwin"} {
-  set plain_unix 1
-}
-
 proc search_nocase {needle haystack} {
   if {$needle eq ""} {return -1}
   if {$haystack eq ""} {return -1}
@@ -72,15 +70,6 @@
   }
 } ; # do_debug
 
-proc get_stacktrace {} {
-  set level [info level]
-  set s ""
-  for {set i 1} {$i < $level} {incr i} {
-    append s [format "Level %u: %s\n" $i [info level $i]]
-  }
-  return $s
-} ; # get_stacktrace
-
 proc maketemp {ext} {
   set fname ""
   foreach i {0 1 2 3 4 5 6 7 8 9} { ; # ten tries
@@ -104,21 +93,6 @@
 
 ### GUI utilities #####################################################
 
-# dummy widgets for vertical spacing within $w
-set idummy -1
-proc spacing {w} {
-  incr ::idummy
-  pack [ttk::label $w.$::idummy -text " "]
-}
-
-proc pgrid {wdg args} { ; # grid command with padding
-  grid $wdg {*}$args -padx 3 -pady 3
-}
-
-proc ppack {wdg args} { ; # pack command with padding
-  pack $wdg {*}$args -padx 3 -pady 3
-}
-
 # mouse clicks: deal with MacOS platform differences
 if {[tk windowingsystem] eq "aqua"} {
   event add <<RightClick>> <ButtonRelease-2> <Control-ButtonRelease-1>
@@ -131,61 +105,16 @@
   set ::default_bg white
 }
 
-# unicode symbols as fake checkboxes in ttk::treeview widgets
-proc mark_sym {mrk} {
-  if $mrk {
-    return "\u25A3" ; # 'white square containing black small square'
-  } else {
-    return "\u25A1" ; # 'white square'
-  }
-} ; # mark_sym
-
-# place a toplevel, or at least its upperleft corner, centered wrt its parent
-proc place_dlg {wnd {p ""}} {
-  if {$p eq ""} {
-    set p [winfo toplevel [winfo parent $wnd]]
-    if {$p eq ""} return
-  }
-  set g [wm geometry $p]
-  scan $g "%dx%d+%d+%d" pw ph px py
-  set hcenter [expr {$px + $pw / 2}]
-  set vcenter [expr {$py + $ph / 2}]
-  set g [wm geometry $wnd]
-  set wh [winfo reqheight $wnd]
-  set ww [winfo reqwidth $wnd]
-  set wx [expr {$hcenter - $ww / 2}]
-  if {$wx < 0} { set wx 0}
-  set wy [expr {$vcenter - $wh / 2}]
-  if {$wy < 0} { set wy 0}
-  wm geometry $wnd [format "+%d+%d" $wx $wy]
-  wm attributes $wnd -topmost 1
-  wm attributes $p -topmost 0
-  wm state $wnd normal
-  raise $wnd $p
-  tkwait visibility $wnd
-  if {$::tcl_platform(platform) ne "windows"} {
-    # dont understand why these give trouble in windows
-    focus $wnd
-    grab set $wnd
-  }
-} ; # place_dlg
-
+# dialog with textbox
 proc long_message {str type {p "."}} {
   # alternate messagebox implemented as custom dialog
   # not all message types are supported
   if {$type ne "ok" && $type ne "okcancel" && $type ne "yesnocancel"} {
-    err_exit "Illegal type $type for long_message"
+    err_exit "Unsupported type $type for long_message"
   }
-  set ::lms_parent $p
-  unset -nocomplain ::lms_var
-  do_debug "type $type"
-  catch {destroy .tlmg}
-  toplevel .tlmg -class Dialog
-  wm withdraw .tlmg
-  wm transient .tlmg .
-  if $::plain_unix {wm attributes .tlmg -type dialog}
+  create_dlg .tlmg $p
 
-  # wallpaper frame; see make_widgets
+  # wallpaper frame; see populate_main
   pack [ttk::frame .tlmg.bg] -fill both -expand 1
   ppack [ttk::frame .tlmg.tx] -in .tlmg.bg -side top -fill both -expand 1
   pack [ttk::scrollbar .tlmg.tx.scroll -command ".tlmg.tx.txt yview"] \
@@ -199,27 +128,22 @@
   # buttons
   pack [ttk::frame .tlmg.bts] -in .tlmg.bg -side bottom -fill x
   if {$type eq "ok" || $type eq "okcancel"} {
-    ttk::button .tlmg.ok -text "ok" -command \
-        {raise $::lms_parent; destroy .tlmg; set ::lms_var "ok"}
+    ttk::button .tlmg.ok -text [__ "ok"] -command "end_dlg \"ok\" .tlmg"
     ppack .tlmg.ok -in .tlmg.bts -side right
   }
   if {$type eq "yesnocancel"} {
-    ttk::button .tlmg.yes -text "yes" -command \
-      {raise $::lms_parent; destroy .tlmg; set::lms_var "yes"}
+    ttk::button .tlmg.yes -text [__ "yes"] -command "end_dlg \"yes\" .tlmg"
     ppack .tlmg.yes -in .tlmg.bts -side right
-    ttk::button .tlmg.no -text "no" -command \
-      {raise $::lms_parent; destroy .tlmg; set ::lms_var "no"}
+    ttk::button .tlmg.no -text [__ "no"] -command "end_dlg \"no\" .tlmg"
     ppack .tlmg.no -in .tlmg.bts -side right
   }
   if {$type eq "yesnocancel" || $type eq "okcancel"} {
-    ttk::button .tlmg.cancel -text "cancel" -command \
-        {raise $::lms_parent; destroy .tlmg; set ::lms_var "cancel"}
+    ttk::button .tlmg.cancel -text [__ "cancel"] -command \
+        "end_dlg \"cancel\" .tlmg"
     ppack .tlmg.cancel -in .tlmg.bts -side right
   }
 
-  place_dlg .tlmg $::lms_parent
-  tkwait variable ::lms_var
-  return $::lms_var
+  place_dlg .tlmg $p
 } ; # long_message
 
 proc any_message {str type {p "."}} {
@@ -242,8 +166,8 @@
 
 ### enabling and disabling user interaction
 
-proc enable_menu_controls {yesno} {
-  if {! $yesno} {
+proc enable_menu_controls {y_n} {
+  if {! $y_n} {
     . configure -menu .mn_empty
     return
   }
@@ -267,18 +191,18 @@
   }
 }; # enable_menu_controls
 
-proc enable_widgets {yesno} {
+proc enable_widgets {y_n} {
   # This proc should cover all active interface elements of the main window.
   # But if actions are initiated via a dialog, the main window can be
-  # deactivated simply by a grab and focus on the dialog.
-  enable_menu_controls $yesno
+  # deactivated by a grab and focus on the dialog instead.
+  enable_menu_controls $y_n
 
-  if $yesno {
+  if $y_n {
     set st !disabled
-    set ::busy "IDLE"
+    set ::busy [__ "IDLE"]
   } else {
     set st disabled
-    set ::busy "BUSY"
+    set ::busy [__ "BUSY"]
   }
 
   # command entry
@@ -322,10 +246,8 @@
 regexp {^.*[\\/]([^\\/\.]*)(?:\....)?$} $progname dummy progname
 set procid [pid]
 
-# package repository (no suport for a one-off repository switch)
-set repo ""
-# while selecting another repo:
-set new_repo ""
+# package repositories
+array unset repos
 
 # mirrors: dict of dicts of lists of urls per country per continent
 set mirrors {}
@@ -333,7 +255,11 @@
 # dict of (local and global) package dicts
 set pkgs [dict create]
 
-set have_remote 0 ; # remote packages info not loaded
+if {$::tcl_platform(platform) ne "windows"} {
+  set ::platforms [dict create]
+}
+
+set have_remote 0 ; # remote packages info not yet loaded
 set need_update_tlmgr 0
 set n_updates 0
 set tlshell_updatable 0
@@ -352,8 +278,11 @@
 ##### handling tlmgr via pipe and stderr tempfile #####################
 
 set prmpt "tlmgr>"
-set busy "BUSY"
+set busy [__ "BUSY"]
 
+# copy logs to log window yes/no
+set show_output 0
+
 # about [chan] gets:
 # if a second parameter, in this case l, is supplied
 # then this variable receives the result, with EOL stripped,
@@ -394,6 +323,7 @@
     tk_messageBox -message [get_stacktrace]
     exit
   }
+  set ::perlpid [pid $::tlshl]
   do_debug "done opening tlmgr"
   set ::err [open $::err_file r]
   chan configure $::tlshl -buffering line -blocking 0
@@ -404,6 +334,7 @@
 proc close_tlmgr {} {
   catch {chan close $::tlshl}
   catch {chan close $::err}
+  set ::perlpid 0
 }; # close_tlmgr
 
 # read a line of tlmgr output
@@ -414,7 +345,7 @@
   if {([catch {chan gets $::tlshl l} len] || [chan eof $::tlshl])} {
     #do_debug "read_line: failing to read "
     puts stderr "Read failure; tlmgr command was $::last_cmd"
-    catch {chan close $::tlshl}
+    if {! [catch {chan close $::tlshl}]} {set ::perlpid 0}
     # note. the right way to terminate is terminating the GUI shell.
     # This closes stdin of tlmgr shell.
     err_exit
@@ -426,16 +357,19 @@
       enable_widgets 1 ; # this may have to be redone later
       # catch up with stderr
       read_err_tempfile
-      if {$::pipe_cb ne ""} {
+      if $::show_output {
         do_debug "prompt found, $l"
-        $::pipe_cb "finish"
+        log_widget_finish
       }
       # for vwait:
       set ::done_waiting 1
+      set ::show_output 0
     } else {
       # regular output
       lappend ::out_log $l
-      if {$::pipe_cb ne ""} {$::pipe_cb "line" "$l"}
+      if $::show_output {
+        log_widget_add $l
+      }
     }
   }
 } ; # read_line
@@ -458,20 +392,47 @@
   }
 } ; # show_err_log
 
+proc log_widget_init {} {
+  show_logs ; # create the logs dialog
+  .tllg.status configure -text [__ "Running"]
+  .tllg.close configure -state disabled
+}
+
+proc log_widget_add l {
+  .tllg.log.tx configure -state normal
+  .tllg.log.tx insert end "$l\n"
+  if {$::tcl_platform(os) ne "Darwin"} {
+    .tllg.log.tx configure -state disabled
+  }
+}
+
+proc log_widget_finish {} {
+  .tllg.log.tx yview moveto 1
+  .tllg.logs select .tllg.log
+  # error log on top if it contains anything
+  show_err_log
+  if {$::tcl_platform(os) ne "Darwin"} {
+    .tllg.log.tx configure -state disabled
+  }
+  .tllg.status configure -text [__ "Idle"]
+  .tllg.close configure -state !disabled
+}
+
 ##### running tlmgr commands #####
 
-# optional callback for run_cmds/read_line:
-set pipe_cb ""
-
 # run a list of commands
-proc run_cmds {cmds {cb ""}} {
-  set ::pipe_cb $cb
+proc run_cmds {cmds {show 0}} {
+  set ::show_output $show
   do_debug "run_cmds \"$cmds\""
   if $::ddebug {puts $::flid "\n$cmds"}
   enable_widgets 0
   set ::out_log {}
   set ::err_log {}
-  if {$::pipe_cb ne ""} {$::pipe_cb "init"}
+  if $show {
+    show_logs
+    .tllg.status configure -text [__ "Running"]
+    .tllg.close configure -state disabled
+  }
   set l [llength $cmds]
   for {set i 0} {$i<$l} {incr i} {
     set cmd [lindex $cmds $i]
@@ -484,71 +445,19 @@
 } ; # run_cmds
 
 # run a single command
-proc run_cmd {cmd {cb ""}} {
-  run_cmds [list $cmd] $cb
+proc run_cmd {cmd {show 0}} {
+  run_cmds [list $cmd] $show
 } ; # run_cmd
 
 proc run_cmd_waiting {cmd} {
-  run_cmd $cmd
+  run_cmd $cmd 0
   vwait ::done_waiting
 } ; # run_cmd_waiting
 
-##### callbacks for file events of tlmgr pipe ::tlshl (names *_cb) ####
-
-# callback for reading tlmgr pipe.
-# but maybe we just want a boolean whether or not to write
-# to the logs notebook.
-# consider writing log to file, always or on demand
-
-# In init mode, it is invoked by run_cmds, otherwise by read_line
-
-## template for pipe callback:
-#proc template_cb {mode {l ""}} {
-#  if {$mode eq "line"} {
-#    # do something
-#  } elseif {$mode eq "init"} {
-#    # do something
-#  } elseif {$mode eq "finish"} {
-#    # do something BUT DO NOT TRIGGER ANOTHER EVENT LOOP
-#  } else {
-#    lappend ::err_log "Illegal call of whatever_cb"
-#    err_exit
-#  }
-#}
-
-proc log_widget_cb {mode {l ""}} {
-  if {$mode eq "line"} {
-    .tllg.log.tx configure -state normal
-    .tllg.log.tx insert end "$l\n"
-    if {$::tcl_platform(os) ne "Darwin"} {
-      .tllg.log.tx configure -state disabled
-    }
-  } elseif {$mode eq "init"} {
-    show_logs
-    .tllg.status configure -text "Running"
-    .tllg.close configure -state disabled
-  } elseif {$mode eq "finish"} {
-    .tllg.log.tx yview moveto 1
-    .tllg.logs select .tllg.log
-    # error log on top if it contains anything
-    show_err_log
-    if {$::tcl_platform(os) ne "Darwin"} {
-      .tllg.log.tx configure -state disabled
-    }
-    .tllg.status configure -text "Idle"
-    .tllg.close configure -state !disabled
-    # the caller, read_line, will set ::done_waiting after
-    # this callback returns from finish mode
-  } else {
-    lappend ::err_log "Illegal call of log_widget_cb"
-    err_exit
-  }
-} ; # log_widget_cb
-
 ##### Handling package info #####
 
 # what invokes what?
-# The main 'globals' are:
+# The main 'globals' are (excepting dicts and arrays):
 
 # ::have_remote is initialized to false. It is set to true by
 # get_packages_info_remote, and remains true except temporarily at
@@ -579,7 +488,7 @@
 
 # collect_filtered does not only filter, but also organize the
 # information to be displayed.  If necessary, it invokes
-# get_packages_info_remote and always invokes display_packes_info.
+# get_packages_info_remote and always invokes display_packages_info.
 # It is invoked at initialization, when filtering options change and
 # at the end of install-, remove- and update procs.
 
@@ -616,11 +525,11 @@
 
   # also update displayed status info
   if {$::have_remote && $::need_update_tlmgr} {
-    .topf.luptodate configure -text "Needs updating"
+    .topf.luptodate configure -text [__ "Needs updating"]
   } elseif $::have_remote {
-    .topf.luptodate configure -text "Up to date"
+    .topf.luptodate configure -text [__ "Up to date"]
   } else {
-    .topf.luptodate configure -text "Unknown"
+    .topf.luptodate configure -text [__ "Unknown"]
   }
   # ... and status of update buttons
   enable_menu_controls 1
@@ -764,8 +673,7 @@
   if [catch {run_cmd_waiting \
     "info --data name,localrev,remoterev,cat-version,category,shortdesc"}] {
     do_debug [get_stacktrace]
-    tk_messageBox -message \
-        "Repository $::repo unavailable. Please choose another one."
+    tk_messageBox -message [__ "A configured repository is unavailable."]
     return 0
   }
   set re {^([^,]+),([0-9]+),([0-9]+),([^,]*),([^,]*),(.*)$}
@@ -814,31 +722,18 @@
   update_globals
 } ; # update_local_revnumbers
 
-##### Dialogs and their supporting procs ##############################
+##### Logs notebook ##############################
 
-# look at dialog.tcl, part of Tk itself, how to implement dialog-type behavior
-
-# So far:
-# - logs notebook,
-# - maybe a toplevel for restoring packages from backup, and
-# - a toplevel for picking a different local or remote repository.
-
-##### logs notebook #####
-
-# if invoked via log_widget_cb init, it tracks progress of a tlmgr command.
-# log_widget_cb will temporarily disable the close button
-# and set .tllg.status to busy.
+# if invoked via run_cmds, it tracks progress of (a) tlmgr command(s).
+# run_cmds will temporarily disable the close button
+# and set .tllg.status to busy via enable_widgets 0.
 # otherwise, it shows the output of the last completed (list of) command(s).
 
 # Note that run_cmds clears ::out_log and ::err_log, but not ::dbg_log.
 
 proc show_logs {} {
-  toplevel .tllg -class Dialog
-  wm withdraw .tllg
-  set p [winfo toplevel [winfo parent .tllg]]
-  wm transient .tllg $p
+  create_dlg .tllg .
   wm title .tllg Logs
-  if $::plain_unix {wm attributes .tllg -type dialog}
 
   # wallpaper
   pack [ttk::frame .tllg.bg] -fill both -expand 1
@@ -881,13 +776,15 @@
     foreach l $::dbg_log {
       .tllg.dbg.tx insert end "$l\n"
     }
-    if {$::tcl_platform(os) ne "Darwin"} {.tllg.dbg.tx configure -state disabled}
+    if {$::tcl_platform(os) ne "Darwin"} {
+      .tllg.dbg.tx configure -state disabled
+    }
     .tllg.dbg.tx yview moveto 1
   }
 
   pack [ttk::notebook .tllg.logs] -in .tllg.bg -side top -fill both -expand 1
-  .tllg.logs add .tllg.log -text "Output"
-  .tllg.logs add .tllg.err -text "Errors"
+  .tllg.logs add .tllg.log -text [__ "Output"]
+  .tllg.logs add .tllg.err -text [__ "Errors"]
   if $::ddebug {
     .tllg.logs add .tllg.dbg -text "Debug"
     raise .tllg.dbg .tllg.logs
@@ -896,46 +793,32 @@
   raise .tllg.log .tllg.logs
 
   pack [ttk::frame .tllg.bottom] -in .tllg.bg -side bottom -fill x
-  ttk::button .tllg.close -text close -command {
-    set p [winfo toplevel [winfo parent .tllg]]
-    if {$p eq ""} {set p "."}
-    raise $p; destroy .tllg}
+  ttk::button .tllg.close -text [__ "Close"] -command {end_dlg 0 .tllg}
   ppack .tllg.close -in .tllg.bottom -side right -anchor e
   ppack [ttk::label .tllg.status -anchor w] -in .tllg.bottom -side left
 
-  place_dlg .tllg $p
+  place_dlg .tllg .
   wm resizable .tllg 1 1
 } ; # show_logs
 
-##### repositories #####
+##### repositories ###############################################
 
-proc get_repo {} {
-  run_cmd_waiting "option repository"
-  # this returns the configured repository.
-  # for now, do not support a temporary change.
-  set re {repository\t(.*)$}
-  foreach l $::out_log {
-    if [regexp $re $l m ::repo] break
-  }
-} ; # get_repo
-
-proc is_repo_local {r} {
-  set db [file join $r "tlpkg/texlive.tlpdb"]
-  return [file exists $db]
-}
-
 ### mirrors
 
-proc edit_name {n} {
+# turn name into a string suitable for a widget name
+proc mangle_name {n} {
   set n [string tolower $n]
   set n [string map {" "  "_"} $n]
   return $n
-} ; # edit_name
+} ; # mangle_name
 
 set mirrors [dict create]
 proc read_mirrors {} {
   if [catch {open [file join [exec kpsewhich -var-value SELFAUTOPARENT] \
-                       "tlpkg/installer/ctan-mirrors.pl"] r} fm] {return 0}
+                   "tlpkg/installer/ctan-mirrors.pl"] r} fm] {
+    do_debug "cannot open mirror list"
+    return 0
+  }
     set re_geo {^\s*'([^']+)' => \{\s*$}
   set re_url {^\s*'(.*)' => ([0-9]+)}
   set re_clo {^\s*\},?\s*$}
@@ -1021,38 +904,142 @@
   if {! $ok} {do_debug $msg}
 } ; # read_mirrors
 
-proc find_local_repo {} {
-  if [is_repo_local $::new_repo] {
-    set inidir $::new_repo
-  } elseif [is_repo_local $::repo] {
-    set inidir $::repo
-  } else {
-    set inidir $::env(HOME) ; # HOME also ok for windows
+proc pick_local_repo {} {
+  set tail "tlpkg/texlive.tlpdb"
+  set nrep [.tlr.cur cget -text]
+  if {! [file exists [file join $nrep $tail]]} {
+    # not local, try originally configured $::repos(main)
+    set nrep $::repos(main)
+    if {! [file exists [file join $nrep $tail]]} {
+      # again, not local
+      set nrep $::env(HOME) ; # HOME also o.k. for windows
+    }
   }
-  set ::new_repo ""
   while 1 {
-    set ::new_repo [tk_chooseDirectory -initialdir $inidir -mustexist 1 \
-                        -parent .tlr -title "Local repository..."]
-    if {$::new_repo ne "" && ! [is_repo_local $::new_repo]} {
-      tk_messageBox -message "$::new_repo not a repository" -parent .tlr
-      set inidir $::new_repo
-      set ::new_repo ""
+    set nrep [browse4dir $nrep .tlr]
+    if {$nrep ne "" && ! [file exists [file join $nrep $tail]]} {
+      tk_messageBox -message [__ "%s not a repository" $nrep] -parent .tlr
       continue
     } else {
       break
     }
   }
-} ; # find_local_repo
+  if {$nrep ne ""} {
+    .tlr.new delete 0 end
+    .tlr.new insert end $nrep
+  }
+} ; # pick_local_repo
 
-proc close_repos {} {
-  raise .
-  destroy .tlr
-  set ::repo $::new_repo
-  if {$::tcl_platform(platform) eq "windows"} {
-    set ::repo [string map {\\ /} $::repo]
+# what is wrong with this version?
+#proc get_repos_from_tlmgr {} {
+#  array unset ::repos
+#  run_cmd_waiting "repository list"
+#  # set re0 {^\s+([^\s\(][^\(]*[^\s\(])\s+\(([^\)]+)\)$}
+#  set re0 {^[ \t]+(\S.*\S)[ \t]+\(([^\)]+)\)$}
+#  set re1 {^[ \t]+(\S.*\S)$}
+#  foreach l $::out_log {
+#    if [regexp $re0 $l dum r t] {
+#      # repository with tag
+#      puts "$l\n$dum\nrep $r tag $t"
+#      set ::repos($t) $r
+#    } elseif [regexp $re1 $l dum r] {
+#      # repository without tag, assign repository itself as tag
+#      puts "rep $r"
+#      set ::repos($r) $r
+#    }
+#  }
+#  if {[llength [array names ::repos]] == 1} {
+#    set n [lindex [array names ::repos] 0]
+#    if {$n ne "main"} {
+#      set ::repos(main) $::repos($n)
+#      array unset ::repos $n
+#    }
+#  }
+#} ; # get_repos_from_tlmgr
+
+proc get_repos_from_tlmgr {} {
+  array unset ::repos
+  run_cmd_waiting "option repository"
+  set rps ""
+  foreach l $::out_log {
+    if [regexp {repository\t(.*)$} $l dum rps] break
   }
-  set ::new_repo ""
-  run_cmd_waiting "option repository $::repo"
+  if {$rps ne ""} {
+    set reps [split $rps " "]
+    set nr [llength $reps]
+    foreach rp $reps {
+      # decode spaces and %
+      #set rp [string map {"%20" " "} $rp]
+      #set rp [string map {"%25" "%"} $rp]
+      if {! [regexp {^(.+)#(.+)$} $rp dum r t]} {
+        # no tag; use repository as its own tag
+        set r $rp
+        set t $rp
+      }
+      if {$nr == 1} {
+        set t "main"
+      }
+      set ::repos($t) $r
+    }
+    if {"main" ni [array names ::repos]} {
+      array unset ::repos
+    }
+  }
+}; # get_repos_from_tlmgr
+
+proc set_repos_in_tlmgr {} {
+  # tlmgr has no command to replace a single repository;
+  # we need to compose opt_location ourselves from $::repos.
+  set nr [llength [array names ::repos]]
+  set opt_repos ""
+  set rp ""
+  foreach nm [array names ::repos] {
+    if {$nr==1} {
+      if {$nm ne "main"} {
+        err_exit "Internal error"
+      } else {
+        set rp $::repos(main)
+      }
+    } else {
+      if {$nm eq $::repos($nm)} {
+        set rp $nm
+      } else {
+        set rp $::repos($nm)
+        append rp "#$nm"
+      }
+    }
+    # for now, ignore the possibility of spaces in paths;
+    # I think tlmgr has bugs there
+    #set rp [string map {"%" "%25"} $rp]
+    #set rp [string map {" " "%20"} $rp]
+    append opt_repos " $rp"
+  }
+  # puts "repository set [string range $opt_repos 1 end]"
+  run_cmd_waiting "repository set [string range $opt_repos 1 end]"
+}; # set_repos_in_tlmgr
+
+proc print_repos {} {
+  set nms [array names ::repos]
+  set c [llength $nms]
+  if {$c <= 0} {
+    return ""
+  } elseif {$c == 1} {
+    set nm [lindex $nms 0]
+    return $::repos($nm)
+  } else {
+    set s [__ "multiple repositories"]
+    set s "($s)"
+    foreach nm $nms {
+      append s "\n$::repos($nm)"
+      if {$nm ne $::repos($nm)} {append s " ($nm)"}
+    }
+    return $s
+  }
+}
+
+proc repos_commit {} {
+  .topf.lrepos configure -text [print_repos]
+  set_repos_in_tlmgr
   close_tlmgr
   start_tlmgr
   # reload remote package information
@@ -1059,12 +1046,11 @@
   set ::have_remote 0
   get_packages_info_remote
   collect_filtered
-} ; # close_repos
+} ; # repos_commit
 
-proc repositories {} {
+# main repository dialog
+proc main_repository {} {
 
-  set ::new_repo $::repo
-
   # dialog toplevel with
   # - popup menu of mirrors (parse tlpkg/installer/ctan-mirrors.pl)
   # - text entry box
@@ -1071,13 +1057,10 @@
   # - directory browser button
   # - ok and cancel buttons
 
-  toplevel .tlr -class Dialog
-  wm withdraw .tlr
-  wm transient .tlr .
-  wm title .tlr "Repositories"
-  if $::plain_unix {wm attributes .tlr -type dialog}
+  create_dlg .tlr .
+  wm title .tlr [__ "Main Repository"]
 
-  # wallpaper frame; see make_widgets
+  # wallpaper frame; see populate_main
   pack [ttk::frame .tlr.bg] -expand 1 -fill x
 
   pack [ttk::frame .tlr.info] -in .tlr.bg -fill x
@@ -1086,78 +1069,155 @@
 
   # current repository
   incr row
-  pgrid [ttk::label .tlr.lcur -text "Current:"] \
+  pgrid [ttk::label .tlr.lcur -text [__ "Current:"]] \
       -in .tlr.info -row $row -column 0 -sticky w
-  pgrid [ttk::label .tlr.cur -textvariable ::repo] \
+  pgrid [ttk::label .tlr.cur -text $::repos(main)] \
       -in .tlr.info -row 0 -column 1 -sticky w
   # new repository
   incr row
-  pgrid [ttk::label .tlr.lnew -text "New"] \
+  pgrid [ttk::label .tlr.lnew -text [__ "New"]] \
       -in .tlr.info -row $row -column 0 -sticky w
-  pgrid [ttk::entry .tlr.new -textvariable ::new_repo -width 40] \
+  pgrid [ttk::entry .tlr.new -width 40] \
       -in .tlr.info -row $row -column 1 -columnspan 2 -sticky w
 
   ### three ways to specify a repository ###
   pack [ttk::frame .tlr.mirbuttons] -in .tlr.bg -fill x
   # default remote repository
-  ttk::button .tlr.ctan -text "Any CTAN mirror" \
-      -command {set ::new_repo "http://mirror.ctan.org/systems/texlive/tlnet"}
+  ttk::button .tlr.ctan -text [__ "Any CTAN mirror"] -command {
+    .tlr.new delete 0 end
+    .tlr.new insert end $::any_mirror
+  }
   ppack .tlr.ctan -in .tlr.mirbuttons -side left -fill x
   # freshly create a cascading mirror dropdown menu
   destroy .tlr.mir.m
   if {[dict size $::mirrors] == 0} read_mirrors
+  do_debug "[dict size $::mirrors] mirrors"
   if {[dict size $::mirrors] > 0} {
-    ttk::menubutton .tlr.mir -text "Specific mirror..." -direction below \
-      -menu .tlr.mir.m
+    ttk::menubutton .tlr.mir -text [__ "Specific mirror..."] \
+        -direction below -menu .tlr.mir.m
     ppack .tlr.mir -in .tlr.mirbuttons -side left -fill x
     menu .tlr.mir.m
     dict for {cont d_cont} $::mirrors {
-      set c_ed [edit_name $cont]
+      set c_ed [mangle_name $cont]
       menu .tlr.mir.m.$c_ed
       .tlr.mir.m add cascade -label $cont -menu .tlr.mir.m.$c_ed
       dict for {cntr urls} $d_cont {
-        set n_ed [edit_name $cntr]
+        set n_ed [mangle_name $cntr]
         menu .tlr.mir.m.$c_ed.$n_ed
         .tlr.mir.m.$c_ed add cascade -label $cntr -menu .tlr.mir.m.$c_ed.$n_ed
         foreach u $urls {
           .tlr.mir.m.$c_ed.$n_ed add command -label $u \
-              -command "set ::new_repo $u"
+              -command ".tlr.new delete 0 end; .tlr.new insert end $u"
         }
       }
     }
   }
   # local repository
-  ttk::button .tlr.browse -text "Local directory..." \
-      -command find_local_repo
+  ttk::button .tlr.browse -text [__ "Local directory..."] -command {
+    .tlr.new delete 0 end; .tlr.new insert end [pick_local_repo]}
   ppack .tlr.browse -in .tlr.mirbuttons -side left -fill x
 
-  spacing .tlr.bg
-
   # two ways to close the dialog
-  pack [ttk::frame .tlr.closebuttons] -in .tlr.bg -fill x
-  ttk::button .tlr.save -text "Save and Load" -command close_repos
+  pack [ttk::frame .tlr.closebuttons] -pady [list 10 0] -in .tlr.bg -fill x
+  ttk::button .tlr.save -text [__ "Save and Load"] -command {
+    set ::repos(main) [.tlr.new get]
+    repos_commit
+    end_dlg "" .tlr
+  }
   ppack .tlr.save -in .tlr.closebuttons -side right
-  ttk::button .tlr.abort -text "Abort"\
-      -command {raise .; destroy .tlr}
+  ttk::button .tlr.abort -text [__ "Abort"] -command {end_dlg "" .tlr}
   ppack .tlr.abort -in .tlr.closebuttons -side right
 
   place_dlg .tlr .
   wm resizable .tlr 0 0
-} ; # repositories
+} ; # main_repository
 
+proc more_repos {} {
+
+  create_dlg .tladr .
+  wm title .tladr [__ "Additional repositories"]
+
+  # wallpaper frame; see populate_main
+  pack [ttk::frame .tladr.bg] -expand 1 -fill x
+
+  set ttl [__ "Additional repositories"]
+  ttk::label .tladr.title -text "$ttl (does nothing yet)" -font bigfont
+  pack .tladr.title -in .tladr.bg -padx 3 -pady 10
+
+  pack [ttk::frame .tladr.tlcf] -in .tladr.bg -anchor w -padx 3 -pady 10
+  ppack [ttk::button .tladr.tlc -text [__ "Add tlcontrib"]] \
+      -in .tladr.tlcf -side left
+  ttk::label .tladr.tlcl -text [__ "Packages which cannot be part of TeX Live"]
+  pack .tladr.tlcl -in .tladr.tlcf -side left
+
+  # treeview with repositories
+  ppack [ttk::frame .tladr.adrf] -in .tladr.bg -fill x -side top
+  ttk::treeview .tladr.reps -columns {url tag} -height 3 -show headings \
+      -selectmode browse -yscrollcommand {.tladr.vsb set}
+  .tladr.reps heading url -text "Url" -anchor w
+  .tladr.reps heading tag -text [__ "Tag (optional)"] -anchor w
+  .tladr.reps column url -width [expr {$::cw * 60}]
+  .tladr.reps column tag -width [expr {$::cw * 15}]
+  grid columnconfigure .tladr.adrf 0 -weight 1
+  ttk::scrollbar .tladr.vsb -orient vertical -command {.tladr.reps yview}
+  incr row
+  grid .tladr.vsb -in .tladr.adrf -row 0 -column 1 -sticky ns
+  grid .tladr.reps -in .tladr.adrf -row 0 -column 0 -sticky news
+  #pack .tladr.reps -in .tladr.adrf -side left -fill both -expand 1
+  foreach nm [array names ::repos] {
+    if {$nm ne "main"} {
+      if {$nm ne $::repos($nm)} {
+        .tladr.reps insert {} end -values [list $::repos($nm) $nm]
+      } else {
+        .tladr.reps insert {} end -values [list $::repos($nm) ""]
+      }
+    }
+  }
+  pack [ttk::frame .tladr.add_del] -in .tladr.bg -fill x -expand 1
+  ppack [ttk::button .tladr.delb -text [__ "Delete"]] \
+      -in .tladr.add_del -side left -fill x
+  ppack [ttk::button .tladr.addb -text [__ "Add"]] \
+      -in .tladr.add_del -side right -fill x
+
+  # pinning
+
+  ppack [ttk::frame .tladr.pinf] -in .tladr.bg -fill x -expand 1
+  ttk::label .tladr.pinl -text "Pinning" -font bfont
+  ttk::scrollbar .tladr.pinvbs -orient vertical -command {.tladr.pintx yview}
+  ttk::scrollbar .tladr.pinhbs -orient horizontal -command {.tladr.pintx xview}
+  text .tladr.pintx -height 3 -wrap none \
+      -yscrollcommand {.tladr.pinvbs set} -xscrollcommand {.tladr.pinhbs set}
+  grid columnconfigure .tladr.pinf 0 -weight 1
+  grid .tladr.pinl -in .tladr.pinf -row 0 -column 0 -sticky w
+  grid .tladr.pinhbs -in .tladr.pinf -row 2 -column 0 -sticky ew
+  grid .tladr.pinvbs -in .tladr.pinf -row 1 -column 1 -sticky ns
+  grid .tladr.pintx -in .tladr.pinf -row 1 -column 0 -sticky news
+
+  pack [ttk::frame .tladr.cancelok] \
+      -in .tladr.bg -fill x -pady [list 10 0] -side bottom
+  ppack [ttk::button .tladr.ok -text [__ "Ok"]] -in .tladr.cancelok -side right
+  ppack [ttk::button .tladr.cancel -text [__ "Cancel"]] \
+      -in .tladr.cancelok -side right
+  .tladr.ok configure -command {end_dlg "" .tladr}
+  .tladr.cancel configure -command {end_dlg "" .tladr}
+
+  place_dlg .tladr
+}
+
 ### platforms
 
 if {$::tcl_platform(platform) ne "windows"} {
 
-  set ::platforms {}
+  # the ::platforms dict has been created earlier
 
   proc toggle_pl_marked {pl cl} {
     # toggle_pl_marked is triggered by a mouse click only in column #1.
-    # 'fut' should get updated in ::platforms and in .tlpl.pl.
+    # 'fut'[ure] should get updated in ::platforms _and_ in .tlpl.pl.
 
     if {$cl ne "#1"} return
     if {$pl eq $::our_platform} {
-      tk_messageBox -message "Cannot remove own platform $::our_platform" \
+      tk_messageBox -message \
+          [__ "Cannot remove own platform %s" $::our_platform] \
           -parent .tlpl
       return
     }
@@ -1179,9 +1239,7 @@
     }
   } ; # toggle_pl_marked
 
-  proc platform_do {} {
-    raise .
-    destroy .tlpl
+  proc platforms_commit {} {
     set pl_add {}
     set pl_remove {}
     dict for {p pd} $::platforms {
@@ -1205,14 +1263,15 @@
       append cmd [join $pl_remove " "]
       lappend cmds $cmd
     }
-    run_cmds $cmds log_widget_cb
+    run_cmds $cmds 1
     vwait ::done_waiting
     update_local_revnumbers
     collect_filtered
 
-  } ; # platform_do
+  } ; # platforms_do
 
-  proc platform_select {} {
+  # the platforms dialog
+  proc platforms_select {} {
     run_cmd_waiting "platform list"
     set ::platforms {}
     foreach l $::out_log {
@@ -1226,17 +1285,14 @@
         dict set ::platforms $p "fut" 1
       }
     }
-    destroy .tlpl
-    toplevel .tlpl -class Dialog
-    wm withdraw .tlpl
-    wm transient .tlpl .
-    wm title .tlpl "Platforms"
+    create_dlg .tlpl
+    wm title .tlpl [__ "Platforms"]
     if $::plain_unix {wm attributes .tlpl -type dialog}
 
     # wallpaper frame
     pack [ttk::frame .tlpl.bg] -expand 1 -fill both
 
-    # platforms treeview
+    # platforms treeview; do we need a scrollbar?
     pack [ttk::frame .tlpl.fpl] -in .tlpl.bg -fill both -expand 1
     ttk::treeview .tlpl.pl -columns {sup plat} -show headings \
         -height [dict size $::platforms] ; # -yscrollcommand {.tlpl.plsb set}
@@ -1244,10 +1300,9 @@
     #ttk::scrollbar .tlpl.plsb -orient vertical \
     #    -command {.tlpl.pl yview}
     #ppack .tlpl.plsb -in .tlpl.fpl -side right -fill y -expand 1
-    foreach col {sup plat} nm {"" "Platform"} {
-      .tlpl.pl heading $col -text $nm -anchor w
-    }
-    .tlpl.pl column sup -width [expr {$::cw * 6}]
+    #.tlpl.pl heading sup -text ""
+    .tlpl.pl column sup -width [expr {$::cw * 8}]
+    .tlpl.pl heading plat -text [__ "platform"] -anchor w
     .tlpl.pl column plat -width [expr {$::cw * 20}]
     dict for {p mks} $::platforms {
       .tlpl.pl insert {} end -id $p -values \
@@ -1265,9 +1320,11 @@
 
     # buttons
     pack [ttk::frame .tlpl.but] -in .tlpl.bg -fill x
-    ttk::button .tlpl.do -text "Apply and close" -command platform_do
-    ttk::button .tlpl.dont -text "Close" -command \
-        {raise .; destroy .tlpl}
+    ttk::button .tlpl.do -text [__ "Apply and close"] -command {
+      platforms_commit; end_dlg "" .tlpl
+    }
+    ttk::button .tlpl.dont -text [__ "Close"] -command \
+        {end_dlg "" .tlpl}
     ppack .tlpl.do -in .tlpl.but -side right
     .tlpl.do configure -state disabled
     ppack .tlpl.dont -in .tlpl.but -side right
@@ -1274,7 +1331,7 @@
 
     place_dlg .tlpl .
     wm resizable .tlpl 0 0
-  } ; # platform_select
+  } ; # platforms_select
 
 } ; # $::tcl_platform(platform) ne "windows"
 
@@ -1287,8 +1344,8 @@
 # dictionary of backups, with mapping to list of available revisions
 set bks {}
 
-proc enable_restore {yesno} {
-  set st [expr {$yesno ? !disabled : disabled}]
+proc enable_restore {y_n} {
+  set st [expr {$y_n ? !disabled : disabled}]
   .tlbk.bklist state $st
   .tlbk.all configure -state $st
   .tlbk.done configure -state $st
@@ -1296,8 +1353,7 @@
 
 proc finish_restore {} {
   vwait ::done_waiting
-  # now log_widget_cb should have done finish mode
-  # and re-enabled its close button.
+  # now log_widget_finish should have run and re-enabled its close button.
   # We won't wait for the log toplevel to close, but we will
   # update the packages display in the main window.
   update_local_revnumbers
@@ -1305,10 +1361,8 @@
 } ; # finish_restore
 
 proc restore_all {} {
-  run_cmd "restore --force --all" log_widget_cb
+  run_cmd "restore --force --all" 1
   finish_restore
-  raise .
-  destroy .tlbk
 } ; # restore_all
 
 proc restore_this {} {
@@ -1322,12 +1376,11 @@
     if {$id ne {}} {set p [.tlbk.bklist set $id pkg]}
   }
   if {$p eq {}} return
-  set ans [tk_messageBox -message "Restore $p to revision $r?" \
+  set ans [tk_messageBox -message [__ "Restore %s to revision %s?" $p $r] \
                -type okcancel -parent .tlbk]
   if {$ans ne {ok}} return
-  run_cmd "restore --force $p $r" log_widget_cb
+  run_cmd "restore --force $p $r" 1
   finish_restore
-  # tkwait window .tllg
 } ; # restore_this
 
 proc bklist_callback_click {x y} {
@@ -1346,7 +1399,7 @@
     if [regexp $re $l m abk] break
   }
   if {$abk == 0} {
-    tk_messageBox -message "No backups configured"
+    tk_messageBox -message [__ "No backups configured"]
     return
   }
   run_cmd_waiting "option backupdir"
@@ -1356,12 +1409,12 @@
     if [regexp $re $l m bdir] break
   }
   if {$bdir eq ""} {
-    tk_messageBox -message "No backup directory defined"
+    tk_messageBox -message [__ "No backup directory defined"]
     return
   }
   set bdir [file join [exec kpsewhich -var-value SELFAUTOPARENT] $bdir]
   if {! [file isdirectory $bdir]} {
-    tk_messageBox -message "Backup directory $bdir does not exist"
+    tk_messageBox -message [__ "Backup directory %s does not exist" $bdir]
     return
   }
   set pwd0 [pwd]
@@ -1368,7 +1421,7 @@
   cd $bdir
   set backups [lsort [glob *.tar.xz]]
   if {[llength $backups] == 0} {
-    tk_messageBox -message "No backups found in $bdir"
+    tk_messageBox -message [__ "No backups found in $bdir"]
     return
   }
   # dictionary of backups; package => list of available revisions
@@ -1384,7 +1437,7 @@
     }
   }
   if {[llength [dict keys $::bks]] == 0} {
-    tk_messageBox -message "No packages in backup directory $bdir"
+    tk_messageBox -message [__ "No packages in backup directory %s" $bdir]
     return
   }
   # invert sort order of revisions for each package
@@ -1394,10 +1447,10 @@
   toplevel .tlbk -class Dialog
   wm withdraw .tlbk
   wm transient .tlbk .
-  wm title .tlbk "Restore from backup"
+  wm title .tlbk [__ "Restore from backup"]
   if $::plain_unix {wm attributes .tlbk -type dialog}
 
-  # wallpaper frame; see make_widgets
+  # wallpaper frame; see populate_main
   pack [ttk::frame .tlbk.bg] -expand 1 -fill x
 
   # the displayed list of backed-up packages
@@ -1410,9 +1463,9 @@
   pack [ttk::scrollbar .tlbk.bkvsb -orient vertical -command \
             {.tlbk.bklist yview}] -in .tlbk.fbk -side right -fill y
 
-  foreach col {"pkg" "rev"} nm {"Package" "Revision"} {
-    .tlbk.bklist heading $col -text $nm -anchor w
-  }
+  .tlbk.bklist heading "pkg" -text [__ "Package"] -anchor w
+  .tlbk.bklist heading "rev" -text [__ "Revision"] -anchor w
+
   .tlbk.bklist column "#0" -width [expr {$::cw * 2}]
   .tlbk.bklist column "pkg" -width [expr {$::cw * 25}]
   .tlbk.bklist column "rev" -width [expr {$::cw * 12}]
@@ -1452,13 +1505,14 @@
 
   # frame with buttons
   pack [ttk::frame .tlbk.fbut] -in .tlbk.bg -side bottom -fill x
-  ppack [ttk::button .tlbk.all -text "Restore all" -command restore_all] \
+  ppack [ttk::button .tlbk.all -text [__ "Restore all"] -command restore_all] \
         -in .tlbk.fbut -side right
-  ppack [ttk::button .tlbk.done -text "Close" \
-             -command {raise .; destroy .tlbk}] -in .tlbk.fbut -side right
+  ppack [ttk::button .tlbk.done -text [__ "Close"] -command {
+    end_dlg "" .tlbk}] -in .tlbk.fbut -side right
 
   place_dlg .tlbk .
   wm resizable .tlbk 0 0
+  tkwait .tlbk
 } ; # restore_backups_dialog
 
 } ; # if $::do_restore
@@ -1469,10 +1523,10 @@
 
 proc update_tlmgr {} {
   if {! $::need_update_tlmgr} {
-    tk_messageBox -message "Nothing to do!"
+    tk_messageBox -message [__ "Nothing to do!"]
     return
   }
-  run_cmd "update --self" log_widget_cb
+  run_cmd "update --self" 1
   vwait ::done_waiting
   # tlmgr restarts itself automatically
   update_local_revnumbers
@@ -1481,13 +1535,13 @@
 
 proc update_all {} {
   if $::need_update_tlmgr {
-    tk_messageBox -message "Update self first!"
+    tk_messageBox -message [__ "Update self first!"]
     return
   } elseif {! $::n_updates} {
-    tk_messageBox -message "Nothing to do!"
+    tk_messageBox -message [__ "Nothing to do!"]
     return
   }
-  run_cmd "update --all" log_widget_cb
+  run_cmd "update --all" 1
   vwait ::done_waiting
   update_local_revnumbers
   collect_filtered
@@ -1523,7 +1577,7 @@
     }
   }
   if {[llength $todo] == 0} {
-    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    tk_messageBox -message [__ "Nothing to do!"] -type ok -icon info
     return
   }
   run_cmd_waiting "install --dry-run $todo"
@@ -1537,13 +1591,13 @@
   }
   if {[llength $deps] > 0} {
     set ans [any_message \
-       "Also installing dependencies\n\n$deps.\n\nContinue?" "okcancel"]
+        [__ "Also installing dependencies\n\n$deps.\n\nContinue?"] "okcancel"]
     if {$ans eq "cancel"} return
   }
-  run_cmd "install $todo" log_widget_cb
+  run_cmd "install $todo" 1
   vwait ::done_waiting
   if {[llength $pre_installed] > 0} {
-    lappend ::err_log "Already installed: $pre_installed"
+    lappend ::err_log [__ "Already installed: %s" $pre_installed]
     show_err_log
   }
   update_local_revnumbers
@@ -1570,7 +1624,7 @@
     }
   }
   if {[llength $todo] == 0} {
-    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    tk_messageBox -message [__ "Nothing to do!"] -type ok -icon info
     return
   }
   run_cmd_waiting "update --dry-run $todo"
@@ -1583,11 +1637,11 @@
     }
   }
   if {[llength $deps] > 0} {
-    set ans [any_message "Also updating dependencies\n\n$deps?" \
+    set ans [any_message [__ "Also updating dependencies\n\n%s?" $deps] \
        "yesnocancel"]
     switch $ans {
       "cancel" return
-      "yes" {run_cmd "update $todo" log_widget_cb}
+      "yes" {run_cmd "update $todo"} 1
       "no" {
         set deps {}
         run_cmd_waiting "update --dry-run --no-depends $todo"
@@ -1598,22 +1652,22 @@
         }
         if {[llength $deps] > 0} {
           set ans [any_message \
-                       "Updating hard dependencies $deps anyway. Continue?" \
+              [__ "Updating hard dependencies %s anyway. Continue?" $deps] \
                        "okcancel"]
           if {$ans eq "cancel"} return
         }
-        run_cmd "update --no-depends $todo" log_widget_cb
+        run_cmd "update --no-depends $todo" 1
       }
     }
   } else {
-    run_cmd "update $todo" log_widget_cb
+    run_cmd "update $todo" 1
   }
   vwait ::done_waiting
   if {[llength $not_inst] > 0} {
-    lappend ::err_log "Skipped because not installed: $not_inst"
+    lappend ::err_log [__ "Skipped because not installed: %s" $not_inst]
   }
   if {[llength $uptodate] > 0} {
-    lappend ::err_log "Skipped because already up to date: $uptodate"
+    lappend ::err_log [__ "Skipped because already up to date: %s" $uptodate]
   }
   if {[llength $not_inst] > 0 || [llength $uptodate] > 0} {
     show_err_log
@@ -1644,15 +1698,15 @@
     }
   }
   if {[llength $todo] == 0} {
-    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    tk_messageBox -message [__ "Nothing to do!"] -type ok -icon info
     return
   }
   if {[llength $deps] > 0} {
-    set ans [any_message "Also remove dependencies\n\n$deps?" \
+    set ans [any_message [__ "Also remove dependencies\n\n%s?" $deps] \
                 "yesnocancel"]
     switch $ans {
       "cancel" return
-      "yes" {run_cmd "remove $todo" log_widget_cb}
+      "yes" {run_cmd "remove $todo" 1}
       "no" {
         set deps {}
         run_cmd_waiting "remove --dry-run --no-depends $todo"
@@ -1663,15 +1717,15 @@
         }
         if {[llength $deps] > 0} {
           set ans [any_message \
-                       "Removing hard dependencies $deps anyway. Continue?" \
+              [__ "Removing hard dependencies %s anyway. Continue?" $deps] \
                        "okcancel"]
           if {$ans eq "cancel"} return
         }
-        run_cmd "remove --no-depends $todo" log_widget_cb
+        run_cmd "remove --no-depends $todo" 1
       }
     }
   } else {
-    run_cmd "remove $todo" log_widget_cb
+    run_cmd "remove $todo" 1
   }
   vwait ::done_waiting
  if {[llength $not_inst] > 0} {
@@ -1694,7 +1748,7 @@
   if {$cmd eq ""} return
   do_debug $cmd
   .ent.e delete 0 end
-  run_cmd $cmd log_widget_cb
+  run_cmd $cmd 1
 }
 
 proc restart_self {} {
@@ -1711,8 +1765,8 @@
   destroy .
 } ; # restart_self
 
-proc toggle_marked {itm cl} {
-  # toggle_marked is triggered by a mouse click only in column #1.
+proc toggle_marked_pkg {itm cl} {
+  # toggle_marked_pkg is triggered by a mouse click only in column #1.
   # 'marked' should get updated in ::pkgs, ::filtered and in .pkglist.
 
   if {$cl ne "#1"} return
@@ -1722,7 +1776,7 @@
   set m [mark_sym $mrk]
   dict set ::filtered $itm [lreplace [dict get $::filtered $itm] 0 0 $m]
   .pkglist set $itm mk $m
-} ; # toggle_marked
+} ; # toggle_marked_pkg
 
 proc mark_all {mrk} {
   foreach nm [dict keys $::pkgs] {
@@ -1756,20 +1810,24 @@
   set lr [dict get $::pkgs [.pkglist focus] "localrev"]
   set rr [dict get $::pkgs [.pkglist focus] "remoterev"]
   .pkg_popup delete 0 end
-  .pkg_popup add command -label "Info" -command \
-      {run_cmd "info [.pkglist focus]" log_widget_cb; \
-           vwait ::done_waiting}
+
+  .pkg_popup add command -label [__ "Info"] -command {
+    run_cmd "info [.pkglist focus]" 1; vwait ::done_waiting
+  }
   if {$::have_remote && ! $::need_update_tlmgr && $rr > 0 && $lr == 0} {
-    .pkg_popup add command -label "Install" -command \
-        {install_pkgs "focus"}
+    .pkg_popup add command -label [__ "Install"] -command {
+      install_pkgs "focus"
+    }
   }
   if {$::have_remote && ! $::need_update_tlmgr && $lr > 0 && $rr > $lr} {
-    .pkg_popup add command -label "Update" -command \
-        {update_pkgs "focus"}
+    .pkg_popup add command -label [__ "Update"] -command {
+      update_pkgs "focus"
+    }
   }
   if {$lr > 0} {
-    .pkg_popup add command -label "Remove" -command \
-        {remove_pkgs "focus"}
+    .pkg_popup add command -label [__ "Remove"] -command {
+      remove_pkgs "focus"
+    }
   }
   .pkg_popup post [expr {$X - 2}] [expr {$Y - 2}]
   focus .pkg_popup
@@ -1776,7 +1834,7 @@
 } ; # do_package_popup_menu
 
 proc set_paper {p} {
-  run_cmd "paper paper $p" log_widget_cb
+  run_cmd "paper paper $p" 1
 }
 
 ##### running external commands #####
@@ -1788,11 +1846,11 @@
   set l "" ; # will contain the line to be read
   if {([catch {chan gets $::capt l} len] || [chan eof $::capt])} {
     catch {chan close $::capt}
-    log_widget_cb "finish"
+    log_widget_finish
     set ::done_waiting 1
   } elseif {$len >= 0} {
     lappend ::out_log $l
-    log_widget_cb "line" $l
+    log_widget_add $l
   }
 }; # read_capt
 
@@ -1808,12 +1866,12 @@
   }
   chan configure $::capt -buffering line -blocking 0
   chan event $::capt readable read_capt
-  log_widget_cb "init"
+  log_widget_init
 }
 
 ##### main window #####
 
-proc make_widgets {} {
+proc populate_main {} {
 
   wm title . "$::progname $::procid"
 
@@ -1824,7 +1882,7 @@
   # the "File" cascade should ensure that the dummy menu
   # occupies the same vertical space as the real menu.
   menu .mn_empty
-  .mn_empty add cascade -label "File" -menu .mn_empty.file -underline 0
+  .mn_empty add cascade -label [__ "File"] -menu .mn_empty.file -underline 0
   if $::plain_unix {
     .mn_empty configure -borderwidth 1
     .mn_empty configure -background $::default_bg
@@ -1846,52 +1904,56 @@
     }
   }
 
-  .mn add cascade -label "File" -menu .mn.file -underline 0
+  .mn add cascade -label [__ "File"] -menu .mn.file -underline 0
   menu .mn.file
-  .mn.file add command -label "Load default repository" \
+  .mn.file add command -label [__ "Load default repository"] \
       -command {get_packages_info_remote; collect_filtered}
-  .mn.file add command -command {destroy .} -label "Exit" -underline 1
+  .mn.file add command -command {destroy .} -label [__ "Exit"] -underline 1
 
-  # inx: keeping count where needed, i.e. when an entry needs to be referenced
-  .mn add cascade -label "Packages" -menu .mn.pkg
+  # inx: keeping count to record indices where needed,
+  # i.e. when an entry needs to be referenced
+  .mn add cascade -label [__ "Packages"] -menu .mn.pkg
   menu .mn.pkg
   set inx 0
   set ::inx_upd_tlmgr $inx
-  .mn.pkg add command -label "Update tlmgr" -command update_tlmgr
+  .mn.pkg add command -label [__ "Update tlmgr"] -command update_tlmgr
   incr inx
   set ::inx_upd_all $inx
-  .mn.pkg add command -label "Update all" -command update_all
+  .mn.pkg add command -label [__ "Update all"] -command update_all
   incr inx
-  .mn.pkg add command -label "Install marked" \
+  .mn.pkg add command -label [__ "Install marked"] \
       -command {install_pkgs "marked"}
   incr inx
-  .mn.pkg add command -label "Update marked" \
+  .mn.pkg add command -label [__ "Update marked"] \
       -command {update_pkgs "marked"}
   incr inx
-  .mn.pkg add command -label "Remove marked" \
+  .mn.pkg add command -label [__ "Remove marked"] \
       -command {remove_pkgs "marked"}
   if $::do_restore {
-  incr inx
-  .mn.pkg add command -label "Restore from backup..." \
-      -command restore_backups_dialog
+    incr inx
+    .mn.pkg add command -label [__ "Restore from backup..."] \
+        -command restore_backups_dialog
   }
 
-  .mn add cascade -label "Actions" -menu .mn.act -underline 0
+  .mn add cascade -label [__ "Actions"] -menu .mn.act -underline 0
   menu .mn.act
-  .mn.act add command -label "Regenerate filename database" -command \
-      {run_external "mktexlsr" "Regenerating filename database..."}
-  .mn.act add command -label "Regenerate formats" -command \
-      {run_external "fmtutil-sys --all" "Rebuilding formats..."}
-  .mn.act add command -label "Regenerate fontmaps" -command \
-      {run_external "updmap-sys" "Rebuilding fontmap files..."}
+  .mn.act add command -label [__ "Regenerate filename database"] -command \
+      {run_external "mktexlsr" [__ "Regenerating filename database..."]}
+  .mn.act add command -label [__ "Regenerate formats"] -command \
+      {run_external "fmtutil-sys --all" [__ "Rebuilding formats..."]}
+  .mn.act add command -label [__ "Regenerate fontmaps"] -command \
+      {run_external "updmap-sys" [__ "Rebuilding fontmap files..."]}
 
-  .mn add cascade -label "Options" -menu .mn.opt -underline 0
+  .mn add cascade -label [__ "Options"] -menu .mn.opt -underline 0
   menu .mn.opt
   set inx 0
-  .mn.opt add command -label "Change repository..." \
-      -command repositories
+  .mn.opt add command -label [__ "Change main repository"] \
+      -command main_repository
   incr inx
-  .mn.opt add cascade -label "Paper" -menu .mn.opt.paper
+  .mn.opt add command -label [__ "Additional repositories"] \
+      -command more_repos
+  incr inx
+  .mn.opt add cascade -label [__ "Paper"] -menu .mn.opt.paper
   menu .mn.opt.paper
   foreach p [list a4 letter] {
     .mn.opt.paper add command -label $p -command "set_paper $p"
@@ -1899,10 +1961,10 @@
   if {$::tcl_platform(platform) ne "windows"} {
     incr inx
     set ::inx_platforms $inx
-    .mn.opt add command -label "Platforms..." -command platform_select
+    .mn.opt add command -label [__ "Platforms"] -command platforms_select
   }
 
-  .mn add cascade -label "Help" -menu .mn.help -underline 0
+  .mn add cascade -label [__ "Help"] -menu .mn.help -underline 0
   menu .mn.help
   .mn.help add command -command {tk_messageBox -message "Helpless"} \
       -label "About"
@@ -1919,47 +1981,45 @@
   ttk::frame .topf
   pack .topf -in .bg -side top -anchor w
 
-  pgrid [ttk::label .topf.llrepo -text "Default repository" -anchor w] \
-      -row 0 -column 0 -sticky w
-  pgrid [ttk::label .topf.lrepo -textvariable ::repo] \
-      -row 0 -column 1 -sticky w
-  pgrid [ttk::label .topf.loaded -text "Not loaded"] \
+  pgrid [ttk::label .topf.llrepo -text [__ "Default repositories"] -anchor w] \
+      -row 0 -column 0 -sticky nw
+  pgrid [ttk::label .topf.lrepos -text ""] \
+      -row 0 -column 1 -sticky nw
+  pgrid [ttk::label .topf.loaded -text [__ "Not loaded"]] \
       -row 1 -column 1 -sticky w
 
-  ttk::label .topf.lluptodate -text "TL Manager up to date?" -anchor w
+  ttk::label .topf.lluptodate -text [__ "TL Manager up to date?"] -anchor w
   pgrid .topf.lluptodate -row 2 -column 0 -sticky w
-  ttk::label .topf.luptodate -text "Unknown" -anchor w
+  ttk::label .topf.luptodate -text [__ "Unknown"] -anchor w
   pgrid .topf.luptodate -row 2 -column 1 -sticky w
 
-  pgrid [ttk::label .topf.llcmd -anchor w -text "Last tlmgr command: "] \
+  pgrid [ttk::label .topf.llcmd -anchor w -text [__ "Last tlmgr command:"]] \
       -row 3 -column 0 -sticky w
   pgrid [ttk::label .topf.lcmd -anchor w -textvariable ::last_cmd] \
       -row 3 -column 1 -sticky w
 
   # command entry widget
-  spacing .bg
   ttk::frame .ent
-  ppack [ttk::label .ent.l -text "Type command:"] -side left
+         ppack [ttk::label .ent.l -text [__ "Type command:"]] -side left
   ppack [ttk::entry .ent.e -width 40] -side left -padx 3
-  ppack [ttk::button .ent.b -text Go -command run_entry] -side left
+         ppack [ttk::button .ent.b -text [__ "Go"] -command run_entry] \
+             -side left
   bind .ent.e <Return> run_entry
-  pack .ent -in .bg -fill x -side top
+  pack .ent -pady 10 -in .bg -fill x -side top
 
-  spacing .bg
-
   # package list
-  ttk::label .lpack -text "Package list" -font TkHeadingFont -anchor w
+  ttk::label .lpack -text [__ "Package list"] -font TkHeadingFont -anchor w
   ppack .lpack -in .bg -side top -fill x
 
   # controlling package list
   ttk::frame .pkfilter
   # filter on status: inst, all, upd
-  ttk::label .pkfilter.lstat -font TkHeadingFont -text "Status"
-  ttk::radiobutton .pkfilter.inst -text Installed -value inst \
+  ttk::label .pkfilter.lstat -font TkHeadingFont -text [__ "Status"]
+  ttk::radiobutton .pkfilter.inst -text [__ "Installed"] -value inst \
       -variable ::stat_opt -command collect_filtered
-  ttk::radiobutton .pkfilter.alls -text All -value all \
+  ttk::radiobutton .pkfilter.alls -text [__ "All"] -value all \
       -variable ::stat_opt -command collect_filtered
-  ttk::radiobutton .pkfilter.upd -text Updatable -value upd \
+  ttk::radiobutton .pkfilter.upd -text [__ "Updatable"] -value upd \
       -variable ::stat_opt -command collect_filtered
   grid .pkfilter.lstat -column 0 -row 0 -sticky w -padx {3 50}
   pgrid .pkfilter.inst -column 0 -row 1 -sticky w
@@ -1967,13 +2027,13 @@
   pgrid .pkfilter.upd -column 0 -row 3 -sticky w
 
   # filter on detail level: all, coll, schm
-  ttk::label .pkfilter.ldtl -font TkHeadingFont -text "Detail >> Global"
-  ttk::radiobutton .pkfilter.alld -text All -value all \
+  ttk::label .pkfilter.ldtl -font TkHeadingFont -text [__ "Detail >> Global"]
+  ttk::radiobutton .pkfilter.alld -text [__ All] -value all \
       -variable ::dtl_opt -command collect_filtered
-  ttk::radiobutton .pkfilter.coll -text "Collections and schemes" -value coll \
+  ttk::radiobutton .pkfilter.coll -text [__ "Collections and schemes"] \
+      -value coll -variable ::dtl_opt -command collect_filtered
+  ttk::radiobutton .pkfilter.schm -text [__ "Only schemes"] -value schm \
       -variable ::dtl_opt -command collect_filtered
-  ttk::radiobutton .pkfilter.schm -text "Only schemes" -value schm \
-      -variable ::dtl_opt -command collect_filtered
   pgrid .pkfilter.ldtl -column 1 -row 0 -sticky w
   pgrid .pkfilter.alld -column 1 -row 1 -sticky w
   pgrid .pkfilter.coll -column 1 -row 2 -sticky w
@@ -1980,9 +2040,9 @@
   pgrid .pkfilter.schm -column 1 -row 3 -sticky w
 
   # marks
-  grid [ttk::button .mrk_all -text "Mark all" -command {mark_all 1}] \
+  grid [ttk::button .mrk_all -text [__ "Mark all"] -command {mark_all 1}] \
       -in .pkfilter -column 2 -row 1 -sticky w -padx {50 3} -pady 3
-  grid [ttk::button .mrk_none -text "Mark none" -command {mark_all 0}] \
+  grid [ttk::button .mrk_none -text [__ "Mark none"] -command {mark_all 0}] \
       -in .pkfilter -column 2 -row 2 -sticky w -padx {50 3} -pady 3
 
   pack .pkfilter -in .bg -side top -fill x
@@ -1990,11 +2050,10 @@
   # search interface
   pack [ttk::frame .pksearch] -in .bg -side top -fill x
   ppack [ttk::label .pksearch.l \
-      -text "Search package names"] \
-      -side left
+             -text [__ "Search package names"]] -side left
   pack [ttk::entry .pksearch.e -width 30] -side left -padx {3 0} -pady 3
   ppack [ttk::checkbutton .pksearch.d -variable ::search_desc \
-             -text "Also search short descriptions"] -side left
+             -text [__ "Also search short descriptions"]] -side left
   bind .pksearch.e <KeyRelease> display_packages_info
   bind .pksearch.d <ButtonRelease> toggle_search_desc
 
@@ -2004,11 +2063,11 @@
       {mk name localrev remoterev shortdesc} \
       -show headings -height 8 -selectmode extended \
       -xscrollcommand {.pkhsb set} -yscrollcommand {.pkvsb set}
-  foreach \
-      col {mk name localrev remoterev shortdesc} \
-      nm {"" Name "Local Rev. (ver.)" "Remote Rev. (ver.)" Description} {
-    .pkglist heading $col -text $nm -anchor w
-  }
+  .pkglist heading mk -text "" -anchor w
+  .pkglist heading name -text [__ "Name"] -anchor w
+  .pkglist heading localrev -text [__ "Local Rev. (ver.)"] -anchor w
+  .pkglist heading remoterev -text [__ "Remote Rev. (ver.)"] -anchor w
+  .pkglist heading shortdesc -text [__ "Description"] -anchor w
   .pkglist column mk -width [expr {$::cw * 3}]
   .pkglist column name -width [expr {$::cw * 25}]
   .pkglist column localrev -width [expr {$::cw * 18}]
@@ -2024,11 +2083,11 @@
   grid rowconfigure .fpkg 0 -weight 1
 
   # "#1" refers to the first column (with mark symbols)
-  bind .pkglist <space> {toggle_marked [.pkglist focus] "#1"}
-  bind .pkglist <Return> {toggle_marked [.pkglist focus] "#1"}
+  bind .pkglist <space> {toggle_marked_pkg [.pkglist focus] "#1"}
+  bind .pkglist <Return> {toggle_marked_pkg [.pkglist focus] "#1"}
   # only toggle when column is "mk" i.e. #1
-  bind .pkglist <ButtonRelease-1> {toggle_marked \
-      [.pkglist identify item %x %y] [.pkglist identify column %x %y]}
+  bind .pkglist <ButtonRelease-1> {toggle_marked_pkg [
+      .pkglist identify item %x %y] [.pkglist identify column %x %y]}
 
   menu .pkg_popup ; # entries added on-the-fly
   bind .pkglist <<RightClick>> {do_package_popup_menu %x %y %X %Y}
@@ -2040,16 +2099,16 @@
   pack [ttk::frame .endbuttons] -in .bg -side bottom -fill x
   ttk::label .busy -textvariable ::busy -font TkHeadingFont -anchor w
   ppack .busy -in .endbuttons -side left
-  ppack [ttk::button .q -text Quit -command {destroy .}] \
+  ppack [ttk::button .q -text [__ Quit] -command {destroy .}] \
       -in .endbuttons -side right
-  ppack [ttk::button .r -text "Restart self" -command restart_self] \
+  ppack [ttk::button .r -text [__ "Restart self"] -command restart_self] \
       -in .endbuttons -side right
-  ppack [ttk::button .t -text "Restart tlmgr" \
+  ppack [ttk::button .t -text [__ "Restart tlmgr"] \
              -command {close_tlmgr; start_tlmgr}] \
       -in .endbuttons -side right
-  ttk::button .showlogs -text "Show logs" -command show_logs
+  ttk::button .showlogs -text [__ "Show logs"] -command show_logs
   ppack .showlogs -in .endbuttons -side right
-} ; # make_widgets
+} ; # populate_main
 
 ##### initialize ######################################################
 
@@ -2056,9 +2115,9 @@
 proc initialize {} {
   # seed random numbers
   expr {srand([clock seconds])}
-  # prepend TL to process searchpath (not needed on windows)
+  # unix: make sure TL comes first on process searchpath
   if {$::tcl_platform(platform) ne "windows"} {
-    set texbin [file dirname [info script]]
+    set texbin [file dirname [file normalize [info script]]]
     set savedir [pwd]
     cd $texbin
     set texbin [pwd]
@@ -2065,16 +2124,11 @@
     cd $savedir
     # prepend texbin to PATH, unless it is already the _first_
     # path component
-    if {$::tcl_platform(platform) eq "unix"} {
-      set pathsep ":"
-    } else {
-      set pathsep ";"
-    }
-    set dirs [split $::env(PATH) $pathsep]
+    set dirs [split $::env(PATH) ":"]
     if {[lindex $dirs 0] ne $texbin} {
-      set ::env(PATH) "$texbin$pathsep$::env(PATH)"
+      set ::env(PATH) "${texbin}:$::env(PATH)"
     }
-    # now is a good time to ask tlmgr for the tl name of our platform
+    # now is a good time to ask tlmgr for the _TL_ name of our platform
     set ::our_platform [exec tlmgr print-platform]
   }
   # directory for temp files
@@ -2118,16 +2172,18 @@
     set ::flid [open $fname w]
   }
 
+  # in case we are going to do something with json:
   # add json subdirectory to auto_path, but at low priority
   # since the tcl/tk installation may already have a better implementation.
-  # Use kpsewhich to find out own directory and bypass symlinks.
+  # Trust kpsewhich to find out own directory and bypass symlinks.
   #set tlsdir [file dirname [exec kpsewhich -format texmfscripts tlshell.tcl]]
   #lappend ::auto_path [file join $tlsdir "json"]
 
-  make_widgets
+  populate_main
 
   start_tlmgr
-  get_repo
+  get_repos_from_tlmgr
+  .topf.lrepos configure -text [print_repos]
   get_packages_info_local
   collect_filtered ; # invokes display_packages_info
   enable_menu_controls 1

Added: trunk/Master/tlpkg/TeXLive/tltcl.tcl
===================================================================
--- trunk/Master/tlpkg/TeXLive/tltcl.tcl	                        (rev 0)
+++ trunk/Master/tlpkg/TeXLive/tltcl.tcl	2018-10-20 09:17:47 UTC (rev 48955)
@@ -0,0 +1,434 @@
+#!/usr/bin/env wish
+
+# Copyright 2018 Siep Kroonenberg
+
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+
+# common declarations for tlshell.tcl and install-tl-gui.tcl
+
+set ::plain_unix 0
+if {$::tcl_platform(platform) eq "unix" && $::tcl_platform(os) ne "Darwin"} {
+  set ::plain_unix 1
+}
+
+# process ID of the perl program that will run in the background
+set ::perlpid 0
+
+set any_mirror "http://mirror.ctan.org/systems/texlive/tlnet"
+
+proc get_stacktrace {} {
+  set level [info level]
+  set s ""
+  for {set i 1} {$i < $level} {incr i} {
+    append s [format "Level %u: %s\n" $i [info level $i]]
+  }
+  return $s
+} ; # get_stacktrace
+
+# what exit procs do we need?
+# - plain error exit with messagebox and stacktrace
+# - plain messagebox exit
+# - showing log output, maybe with appended message,
+#   use log toplevel for lengthy output
+# is closing the pipe $::inst guaranteed to kill perl? It should be
+
+proc err_exit {{mess ""}} {
+  if {$mess eq ""} {set mess "Error"}
+  append mess "\n" [get_stacktrace]
+  if $::plain_unix {
+    # plain_unix: avoid a RenderBadPicture error on quitting.
+    # 'send' changes the shutdown sequence,
+    # which avoids triggering the bug.
+    # 'tk appname <something>' restores 'send' and avoids the bug
+    bind . <Destroy> {
+      catch {tk appname appname}
+    }
+  }
+  tk_messageBox -icon error -message $mess
+  # kill perl process, just in case
+  if $::perlpid {
+    catch {
+      if {$::tcl_platform(platform) eq "unix"} {
+        exec -ignorestderr "kill" $::perlpid
+      } else {
+        exec -ignorestderr "taskkill" "/pid" $::perlpid
+      }
+    }
+  }
+  exit
+} ; # err_exit
+
+# localization support
+# tcl 8.5 observes LANG on Unix, but is overruled by LC_ALL.
+# for 8.5 or on Mac OS, locale setting from within tcl may not work.
+# so let the shell wrapper handle a language option by setting LANG
+# and unsetting LC_ALL.
+
+# $TEXMFCONFIG/tlmgr/config can have a setting for gui-lang.
+# replace with shell script / batchfile which is sourced?
+
+# for windows there is a bundled 8.6 in which locale can be set on-the-fly.
+# consult registry for default locale if LANG is not set.
+# The wrapper already does this, but here we do it again
+# in case e.g. company policy blocked reg.exe.
+
+# check the command-line for a lang parameter
+unset -nocomplain lang
+set i 0
+while {$i < $::argc} {
+  set p [lindex $::argv $i]
+  incr i
+  if {$p eq "-lang" || $p eq "--lang"} {
+    if {$i < $::argc} {
+      set lang [lindex $::argv $i]
+      break
+    }
+  } elseif {[string range $p 0 5] eq "-lang="} {
+    set lang [string range $p 6 end]
+    break
+  } elseif {[string range $p 0 6] eq "--lang="} {
+    set lang [string range $p 7 end]
+    break
+  }
+}
+unset i
+
+# first fallback: check config file if available
+if {! [info exists lang] || $lang eq ""} {
+  foreach tmf {"TEXMFCONFIG" "TEXMFSYSCONFIG"} {
+    if [catch {exec kpsewhich -var-value $tmf} d] {
+      break; # apparently there is not yet a TL installation
+    }
+    if [catch {open [file join $d "tlmgr" "config"] r} fid] continue
+    while 1 {
+      if [catch {chan gets $fid} l] break
+      if {[regexp {^gui-lang\s*=\s*(\S+)$} $l m lang]} {
+        chan close $fid
+        break
+      }
+    }
+    if {[info exists lang] && $lang ne ""} break
+  }
+}
+
+# second fallback: check environment for LC_ALL, LC_MESSAGES and LANG
+if {! [info exists lang] || $lang eq ""} {
+  foreach lng {"LC_ALL" "LC_MESSAGES" "LANG"} {
+    if {[info exists ::env($lng)] && $::env($lng) ne ""} {
+      set lang $::env($lng)
+      break
+    }
+  }
+}
+
+# third fallback, windows-only: check registry
+if {(! [info exists lang] || $lang eq "") && \
+        $::tcl_platform(platform) eq "windows"} {
+  if {! [catch {package require registry}]} {
+    set regpath [join {HKEY_LOCAL_MACHINE system currentcontrolset \
+      control nls language} "\\"]
+    if {! [catch {registry get $regpath "Installlanguage"} lcode]} {
+      set regpath [join {HKEY_CLASSES_ROOT mime database rfc1766} "\\"]
+      if {! [catch {registry get $regpath $lcode} lng]} {
+        set l [string first ";" $lng]
+        if {$l > 0} {
+          incr l -1
+          set lng [string range $lng 0 $l]
+        }
+        set lang $lng
+        #tk_messageBox -message "Language $lang in registry found"
+      }
+    }
+  }
+}
+
+# load the message catalog
+package require msgcat
+if {[info exists lang] && $lang ne ""} {
+  ::msgcat::mclocale $lang
+  #unset lang
+}
+::msgcat::mcload [file join $::instroot "tlpkg" "translations"]
+
+proc __ {s args} {return [::msgcat::mc $s {*}$args]}
+
+# string representation of booleans
+proc yes_no {b} {
+  if $b {
+    set ans [::msgcat::mc "Yes"]
+  } else {
+    set ans [::msgcat::mc "No"]
+  }
+  return $ans
+}
+
+if {$::tcl_platform(os) eq "Darwin"} {
+  # avoid warnings 'tar: Failed to set default locale'
+  set ::env(LC_ALL) "en_US.UTF-8"
+}
+
+### fonts ###
+
+# no bold text for messages; `userDefault' indicates priority
+option add *Dialog.msg.font TkDefaultFont userDefault
+
+# larger fonts: lfont and bold titlefont
+font create lfont {*}[font configure TkDefaultFont]
+font configure lfont -size [expr {round(1.2 * [font actual lfont -size])}]
+font create bfont {*}[font configure TkDefaultFont]
+font configure bfont -weight bold
+font create hfont {*}[font configure lfont]
+font configure hfont -weight bold
+font create titlefont {*}[font configure TkDefaultFont]
+font configure titlefont -weight bold \
+    -size [expr {round(1.5 * [font actual titlefont -size])}]
+
+## italicized items; not used
+#font create it_font {*}[font configure TkDefaultFont]
+#font configure it_font -slant italic
+
+# width of '0', as a very rough estimate of average character width
+# assume height == width*2
+set ::cw [font measure TkTextFont "0"]
+
+# default foreground color and disabled foreground color
+# may not be black in e.g. dark color schemes
+set blk [ttk::style lookup TButton -foreground]
+set gry [ttk::style lookup TButton -foreground disabled]
+
+# 'default' padding
+
+proc ppack {wdg args} { ; # pack command with padding
+  pack $wdg {*}$args -padx 3 -pady 3
+}
+
+proc pgrid {wdg args} { ; # grid command with padding
+  grid $wdg {*}$args -padx 3 -pady 3
+}
+
+# unicode symbols as fake checkboxes in ttk::treeview widgets
+
+proc mark_sym {mrk} {
+  if $mrk {
+    return "\u25A3" ; # 'white square containing black small square'
+  } else {
+    return "\u25A1" ; # 'white square'
+  }
+} ; # mark_sym
+
+# for help output
+set ::env(NOPERLDOC) 1
+
+##### dialog support #####
+
+# for example code, look at dialog.tcl, part of Tk itself
+
+# global variable for dialog return value, in case the outcome
+# must be handled by the caller rather than by the dialog itself
+
+set ::dialog_ans {}
+
+# start new toplevel with settings appropriate for a dialog
+proc create_dlg {wnd {p .}} {
+  catch {destroy $wnd} ; # no error if it does not exist
+  toplevel $wnd -class Dialog
+  wm withdraw $wnd
+  if [winfo viewable $p] {wm transient $wnd $p}
+  if $::plain_unix {wm attributes $wnd -type dialog}
+  wm protocol $wnd WM_DELETE_WINDOW {destroy $wnd}
+}
+
+# Place a dialog centered wrt its parent.
+# If its geometry is somehow not yet available,
+# its upperleft corner will be centered.
+
+proc place_dlg {wnd {p "."}} {
+  set g [wm geometry $p]
+  scan $g "%dx%d+%d+%d" pw ph px py
+  set hcenter [expr {$px + $pw / 2}]
+  set vcenter [expr {$py + $ph / 2}]
+  set g [wm geometry $wnd]
+  set wh [winfo reqheight $wnd]
+  set ww [winfo reqwidth $wnd]
+  set wx [expr {$hcenter - $ww / 2}]
+  if {$wx < 0} { set wx 0}
+  set wy [expr {$vcenter - $wh / 2}]
+  if {$wy < 0} { set wy 0}
+  wm geometry $wnd [format "+%d+%d" $wx $wy]
+  wm state $wnd normal
+  wm attributes $wnd -topmost
+  raise $wnd $p
+  tkwait visibility $wnd
+  focus $wnd
+  grab set $wnd
+} ; # place_dlg
+
+# place dialog answer in ::dialog_ans, raise parent, close dialog
+proc end_dlg {ans wnd} {
+  set ::dialog_ans $ans
+  set p [winfo parent $wnd]
+  if {$p eq ""} {set p "."}
+  raise $p
+  destroy $wnd
+} ; # end_dlg
+
+##### directories #####
+
+# slash flipping
+proc forward_slashify {s} {
+  regsub -all {\\} $s {/} r
+  return $r
+}
+proc native_slashify {s} {
+  if {$::tcl_platform(platform) eq "windows"} {
+    regsub -all {/} $s {\\} r
+  } else {
+    regsub -all {\\} $s {/} r
+  }
+  return $r
+}
+
+# unix: choose_dir replacing native directory browser
+
+if {$::tcl_platform(platform) eq "unix"} {
+
+  # Based on the tcl/tk widget demo.
+  # Also for MacOS, because we want to see /usr.
+  # For windows, the native browser widget is better.
+
+  ## Code to populate a single directory node
+  proc populateTree {tree node} {
+    if {[$tree set $node type] ne "directory"} {
+      set type [$tree set $node type]
+      return
+    }
+    $tree delete [$tree children $node]
+    foreach f [lsort [glob -nocomplain -directory $node *]] {
+      set type [file type $f]
+      if {$type eq "directory"} {
+        $tree insert $node end \
+            -id $f -text [file tail $f] -values [list $type]
+        # Need at least one child to make this node openable,
+        # will be deleted when actually populating this node
+        $tree insert $f 0 -text "dummy"
+      }
+    }
+    # Stop this code from rerunning on the current node
+    $tree set $node type processedDirectory
+  }
+
+  proc choose_dir {initdir {parent .}} {
+
+    create_dlg .browser $parent
+    wm title .browser [__ "Browse..."]
+
+    # wallpaper
+    pack [ttk::frame .browser.bg -padding 3] -fill both -expand 1
+    ## Create the tree and set it up
+    pack [ttk::frame .browser.fr0] -in .browser.bg -fill both -expand 1
+    set tree [ttk::treeview .browser.tree \
+                  -columns {type} -displaycolumns {} -selectmode browse \
+                  -yscroll ".browser.vsb set"]
+    .browser.tree column 0 -minwidth 500 -stretch 0
+    ttk::scrollbar .browser.vsb -orient vertical -command "$tree yview"
+    # hor. scrolling does not work, but toplevel and widget are resizable
+    $tree heading \#0 -text "/"
+    $tree insert {} end -id "/" -text "/" -values [list "directory"]
+
+    populateTree $tree "/"
+    bind $tree <<TreeviewOpen>> {
+      populateTree %W [%W focus]
+    }
+    bind $tree <ButtonRelease-1> {
+      .browser.tree heading \#0 -text [%W focus]
+    }
+
+    ## Arrange the tree and its scrollbar in the toplevel
+    # horizontal scrolling does not work.
+    # possible solution: very wide treeview in smaller paned window
+    # (may as well use pack in the absence of a horizontal scrollbar)
+    grid $tree .browser.vsb -sticky nsew -in .browser.fr0
+    grid columnconfigure .browser.fr0 0 -weight 1
+    grid rowconfigure .browser.fr0 0 -weight 1
+
+    # ok and cancel buttons
+    pack [ttk::frame .browser.fr1] -in .browser.bg -fill x -expand 1
+    ppack [ttk::button .browser.ok -text [__ "Ok"]] \
+        -in .browser.fr1 -side right
+    ppack [ttk::button .browser.cancel -text [__ "Cancel"]] \
+        -in .browser.fr1 -side right
+    .browser.ok configure -command {
+      set ::dialog_ans [.browser.tree focus]
+      destroy .browser
+    }
+    .browser.cancel configure -command {
+      set ::dialog_ans ""
+      destroy .browser
+    }
+    unset -nocomplain ::dialog_ans
+
+    # navigate tree to $initdir
+    set chosenDir {}
+    foreach d [file split [file normalize $initdir]] {
+      set nextdir [file join $chosenDir $d]
+      if [file isdirectory $nextdir] {
+        if {! [$tree exists $nextdir]} {
+          $tree insert $chosenDir end -id $nextdir \
+              -text $d -values [list "directory"]
+        }
+        populateTree $tree $nextdir
+        set chosenDir $nextdir
+      } else {
+        break
+      }
+    }
+    $tree see $chosenDir
+    $tree selection set [list $chosenDir]
+    $tree focus $chosenDir
+    $tree heading \#0 -text $chosenDir
+
+    place_dlg .browser $parent
+    tkwait window .browser
+    return $::dialog_ans
+  }; # choose_dir
+
+}; # if unix
+
+proc browse4dir {inidir {parent .}} {
+  if {$::tcl_platform(platform) eq "unix"} {
+    return [choose_dir $inidir $parent]
+  } else {
+    return [tk_chooseDirectory \
+        -initialdir $inidir -title [__ "Select or type"] -parent $parent]
+  }
+} ; # browse4dir
+
+# browse for a directory and store in entry- or label widget $w
+proc dirbrowser2widget {w} {
+  set wclass [winfo class $w]
+  if {$wclass eq "Entry" || $wclass eq "TEntry"} {
+    set is_entry 1
+  } elseif {$wclass eq "Label" || $wclass eq "TLabel"} {
+    set is_entry 0
+  } else {
+    err_exit "browse2widget invoked with unsupported widget class $wclass"
+  }
+  if $is_entry {
+    set retval [$w get]
+  } else {
+    set retval [$w cget -text]
+  }
+  set retval [browse4dir $retval [winfo parent $w]]
+  if {$retval eq ""} {
+    return 0
+  } else {
+    if {$wclass eq "Entry" || $wclass eq "TEntry"} {
+      $w delete 0 end
+      $w insert 0 $retval
+    } else {
+      $w configure -text $retval
+    }
+    return 1
+  }
+}


Property changes on: trunk/Master/tlpkg/TeXLive/tltcl.tcl
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tl-update-messages
===================================================================
--- trunk/Master/tlpkg/bin/tl-update-messages	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/bin/tl-update-messages	2018-10-20 09:17:47 UTC (rev 48955)
@@ -38,6 +38,7 @@
        tlpkg/installer/install-menu-perltk.pl \
        texmf-dist/scripts/texlive/tlmgrgui.pl \
        tlpkg/installer/install-tl-gui.tcl \
+       tlpkg/TeXLive/tltcl.tcl \
        texmf-dist/scripts/tlshell/tlshell.tcl \
        $tmpfile
 rm $tmpfile

Modified: trunk/Master/tlpkg/installer/install-tl-gui.tcl
===================================================================
--- trunk/Master/tlpkg/installer/install-tl-gui.tcl	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/installer/install-tl-gui.tcl	2018-10-20 09:17:47 UTC (rev 48955)
@@ -5,7 +5,7 @@
 # This file is licensed under the GNU General Public License version 2
 # or any later version.
 
-# Tcl/Tk wrapper for TeX Live installer
+# Tcl/Tk frontend for TeX Live installer
 
 # Installation can be divided into three stages:
 #
@@ -35,103 +35,25 @@
 # security: disable send
 catch {rename send {}}
 
-# menus: disable tearoff feature
-option add *Menu.tearOff 0
-
-# no bold text for messages; `userDefault' indicates priority
-option add *Dialog.msg.font TkDefaultFont userDefault
-
-# larger fonts
-font create lfont {*}[font configure TkDefaultFont]
-font configure lfont -size [expr {round(1.2 * [font actual lfont -size])}]
-font create hfont {*}[font configure lfont]
-font configure hfont -weight bold
-font create titlefont {*}[font configure TkDefaultFont]
-font configure titlefont -weight bold \
-    -size [expr {round(1.5 * [font actual titlefont -size])}]
-
-## italicized items; not used
-#font create it_font {*}[font configure TkDefaultFont]
-#font configure it_font -slant italic
-
-# string representation of booleans
-proc yes_no {b} {
-  return [expr {$b ? [__"Yes"] : [__ "No"]}]
-}
-
-# default foreground color and disabled foreground color
-# may not be black in e.g. dark color schemes
-set blk [ttk::style lookup TButton -foreground]
-set gry [ttk::style lookup TButton -foreground disabled]
-
-### initialize some globals ###
-
-# perl installer process id
-set ::perlpid 0
-
-# global variable for dialogs
-set ::dialog_ans {}
-
-set ::plain_unix 0
-if {$::tcl_platform(platform) eq "unix" && $::tcl_platform(os) ne "Darwin"} {
-  set ::plain_unix 1
-}
-
-# for help output
-set ::env(NOPERLDOC) 1
-
-set ::out_log {}; # list of strings
-
 # this file should be in $::instroot/tlpkg/installer.
 # at the next release, it may be better to start the installer, perl or tcl,
 # from a shell wrapper, also on unix-like platforms
 # this allows automatic inclusion of '--' parameter to separate
 # tcl parameters from script parameters
+
 set ::instroot [file normalize [info script]]
 set ::instroot [file dirname [file dirname [file dirname $::instroot]]]
 
-# localization support
-# tcl 8.5 observes LC_ALL on linux, LANG on Mac OS.
-# so let the shell wrapper handle a language option.
-# for 8.5, locale setting from within tcl may not work.
+# declarations and procs shared with tlshell.tcl
+source [file join $::instroot "tlpkg" "TeXLive" "tltcl.tcl"]
 
-# exception: windows, for which there is a bundled 8.6.
-# consult registry for default locale if LANG is not set.
-# The wrapper already does this, but here we do it again
-# in case company policy blocked reg.exe.
+### initialize some globals ###
 
-if {$::tcl_platform(platform) eq "windows"} {
-  if {! [info exists ::env(LANG)] || $::env(LANG) eq ""} {
-    if {! [catch {package require registry}]} {
-      set regpath [join {HKEY_LOCAL_MACHINE system currentcontrolset
-        control nls language} "\\"]
-      if {! [catch {registry get $regpath "Installlanguage"} lcode]} {
-        set regpath [join {HKEY_CLASSES_ROOT mime database rfc1766} "\\"]
-        if {! [catch {registry get $regpath $lcode} lng]} {
-          set l [string first ";" $lng]
-          if {$l > 0} {
-            incr l -1
-            set lng [string range $lng 0 $l]
-          }
-          set ::env(LANG) $lng
-          # tk_messageBox -message "Language $lng in registry found"
-        }
-      }
-    }
-  }
-}
+# perl installer process id
+set ::perlpid 0
 
-# inside tcl, just load the message catalogs (all languages)
-package require msgcat
-namespace import msgcat::mc
-::msgcat::mcload [file join $::instroot "tlpkg" "translations"]
+set ::out_log {}; # list of strings
 
-if {$::tcl_platform(os) eq "Darwin"} {
-  # avoid warnings 'tar: Failed to set default locale'
-  set ::env(LC_ALL) "en_US.UTF-8"
-}
-proc __ {s args} {return [::msgcat::mc $s {*}$args]}
-
 set ::perlbin "perl"
 if {$::tcl_platform(platform) eq "windows"} {
   set ::perlbin "${::instroot}/tlpkg/tlperl/bin/wperl.exe"
@@ -139,6 +61,9 @@
 
 ### procedures, mostly organized bottom-up ###
 
+# the procedures which provide the menu with the necessary backend data,
+# i.e. read_descs, read_vars and read_menu_data, are defined near the end.
+
 set clock0 [clock milliseconds]
 set profiling 0
 proc show_time {s} {
@@ -147,15 +72,6 @@
   }
 }
 
-proc get_stacktrace {} {
-  set level [info level]
-  set s ""
-  for {set i 1} {$i < $level} {incr i} {
-    append s [format "Level %u: %s\n" $i [info level $i]]
-  }
-  return $s
-} ; # get_stacktrace
-
 # for debugging frontend-backend communication:
 # write to a logfile which is shared with the backend.
 # both parties open, append and close every time.
@@ -174,31 +90,6 @@
   close $db
 }
 
-# dummy translation function
-#proc _ {fmt args} {return [format $fmt {*}$args]}
-
-# what exit procs do we need?
-# - plain error exit with messagebox and stacktrace
-# - plain messagebox exit
-# - showing log output, maybe with appended message,
-#   use log toplevel for lengthy output
-# is closing the pipe $::inst guaranteed to kill perl? It should be
-
-proc err_exit {{mess ""}} {
-  if {$mess eq ""} {set mess [__ "Error"]}
-  append mess "\n" [get_stacktrace]
-  tk_messageBox -icon error -message $mess
-  # kill perl process, just in case
-  if $::perlpid {
-    if {$::tcl_platform(platform) eq "unix"} {
-      exec -ignorestderr "kill" $::perlpid
-    } else {
-      exec -ignorestderr "taskkill" "/pid" $::perlpid
-    }
-  }
-  exit
-} ; # err_exit
-
 proc maybe_print_welcome {} {
   # if the last non-empty line was "All done", then installation is completed.
   # otherwise, it was help output or an interrupted installation.
@@ -290,72 +181,6 @@
   }
 }; # read_line_cb
 
-# general gui utilities
-
-# width of '0', as a rough estimate of average character width
-# assume height == width*2
-set ::cw [font measure TkTextFont "0"]
-
-# unicode symbols as fake checkboxes in ttk::treeview widgets
-proc mark_sym {mrk} {
-  if $mrk {
-    return "\u25A3" ; # 'white square containing black small square'
-  } else {
-    return "\u25A1" ; # 'white square'
-  }
-} ; # mark_sym
-
-proc ppack {wdg args} { ; # pack command with padding
-  pack $wdg {*}$args -padx 3 -pady 3
-}
-
-proc pgrid {wdg args} { ; # grid command with padding
-  grid $wdg {*}$args -padx 3 -pady 3
-}
-
-# start new toplevel with settings appropriate for a dialog
-proc create_dlg {wnd {p .}} {
-  catch {destroy $wnd} ; # no error if it does not exist
-  toplevel $wnd -class Dialog
-  wm withdraw $wnd
-  if [winfo viewable $p] {wm transient $wnd $p}
-  if $::plain_unix {wm attributes $wnd -type dialog}
-  wm protocol $wnd WM_DELETE_WINDOW {destroy $wnd}
-}
-
-# Place a dialog centered wrt its parent.
-# If its geometry is somehow not yet available,
-# its upperleft corner will be centered.
-
-proc place_dlg {wnd {p "."}} {
-  set g [wm geometry $p]
-  scan $g "%dx%d+%d+%d" pw ph px py
-  set hcenter [expr {$px + $pw / 2}]
-  set vcenter [expr {$py + $ph / 2}]
-  set g [wm geometry $wnd]
-  set wh [winfo reqheight $wnd]
-  set ww [winfo reqwidth $wnd]
-  set wx [expr {$hcenter - $ww / 2}]
-  if {$wx < 0} { set wx 0}
-  set wy [expr {$vcenter - $wh / 2}]
-  if {$wy < 0} { set wy 0}
-  wm geometry $wnd [format "+%d+%d" $wx $wy]
-  wm state $wnd normal
-  wm attributes $wnd -topmost
-  raise $wnd $p
-  tkwait visibility $wnd
-  focus $wnd
-  grab set $wnd
-} ; # place_dlg
-
-# place dialog answer in ::dialog_ans, raise parent, close dialog
-proc end_dlg {ans wnd {p "."}} {
-  set ::dialog_ans $ans
-  raise $p
-  wm withdraw $wnd
-  destroy $wnd
-} ; # end_dlg
-
 ##############################################################
 
 ##### special-purpose uses of main window: splash, log #####
@@ -370,6 +195,7 @@
     label .image -image tlimage -background white
     pack .image -in .white
   }
+
   # wallpaper
   pack [ttk::frame .bg -padding 3] -fill both -expand 1
 
@@ -442,165 +268,6 @@
 
 #############################################################
 
-##### directories #####
-
-set sep [file separator]
-
-# slash flipping
-proc forward_slashify {s} {
-  regsub -all {\\} $s {/} r
-  return $r
-}
-proc native_slashify {s} {
-  if {$::tcl_platform(platform) eq "windows"} {
-    regsub -all {/} $s {\\} r
-  } else {
-    regsub -all {\\} $s {/} r
-  }
-  return $r
-}
-
-# unix: choose_dir replacing native directory browser
-
-if {$::tcl_platform(platform) ne "windows"} {
-
-  # Based on the tcl/tk widget demo.
-  # Also for MacOS, because we want to see /usr.
-  # For windows, the native browser widget is better.
-
-  ## Code to populate a single directory node
-  proc populateTree {tree node} {
-    if {[$tree set $node type] ne "directory"} {
-      set type [$tree set $node type]
-      return
-    }
-    $tree delete [$tree children $node]
-    foreach f [lsort [glob -nocomplain -directory $node *]] {
-      set type [file type $f]
-      if {$type eq "directory"} {
-        $tree insert $node end \
-            -id $f -text [file tail $f] -values [list $type]
-        # Need at least one child to make this node openable,
-        # will be deleted when actually populating this node
-        $tree insert $f 0 -text "dummy"
-      }
-    }
-    # Stop this code from rerunning on the current node
-    $tree set $node type processedDirectory
-  }
-
-  proc choose_dir {initdir {parent .}} {
-
-    create_dlg .browser $parent
-    wm title .browser [__ "Browse..."]
-
-    # wallpaper
-    pack [ttk::frame .browser.bg -padding 3] -fill both -expand 1
-    ## Create the tree and set it up
-    pack [ttk::frame .browser.fr0] -in .browser.bg -fill both -expand 1
-    set tree [ttk::treeview .browser.tree \
-                  -columns {type} -displaycolumns {} -selectmode browse \
-                  -yscroll ".browser.vsb set"]
-    .browser.tree column 0 -minwidth 500 -stretch 0
-    ttk::scrollbar .browser.vsb -orient vertical -command "$tree yview"
-    # hor. scrolling does not work, but toplevel and widget are resizable
-    $tree heading \#0 -text "/"
-    $tree insert {} end -id "/" -text "/" -values [list "directory"]
-
-    populateTree $tree "/"
-    bind $tree <<TreeviewOpen>> {
-      populateTree %W [%W focus]
-    }
-    bind $tree <ButtonRelease-1> {
-      .browser.tree heading \#0 -text [%W focus]
-    }
-
-    ## Arrange the tree and its scrollbar in the toplevel
-    # horizontal scrolling does not work.
-    # possible solution: very wide treeview in smaller paned window
-    # (may as well use pack in the absence of a horizontal scrollbar)
-    grid $tree .browser.vsb -sticky nsew -in .browser.fr0
-    grid columnconfigure .browser.fr0 0 -weight 1
-    grid rowconfigure .browser.fr0 0 -weight 1
-
-    # ok and cancel buttons
-    pack [ttk::frame .browser.fr1] -in .browser.bg -fill x -expand 1
-    ppack [ttk::button .browser.ok -text [__ "Ok"]] \
-        -in .browser.fr1 -side right
-    ppack [ttk::button .browser.cancel -text [__ "Cancel"]] \
-        -in .browser.fr1 -side right
-    .browser.ok configure -command {
-      set ::dialog_ans [.browser.tree focus]
-      destroy .browser
-    }
-    .browser.cancel configure -command {
-      set ::dialog_ans ""
-      destroy .browser
-    }
-    unset -nocomplain ::dialog_ans
-
-    # navigate tree to $initdir
-    set chosenDir {}
-    foreach d [file split [file normalize $initdir]] {
-      set nextdir [file join $chosenDir $d]
-      if [file isdirectory $nextdir] {
-        if {! [$tree exists $nextdir]} {
-          $tree insert $chosenDir end -id $nextdir \
-              -text $d -values [list "directory"]
-        }
-        populateTree $tree $nextdir
-        set chosenDir $nextdir
-      } else {
-        break
-      }
-    }
-    $tree see $chosenDir
-    $tree selection set [list $chosenDir]
-    $tree focus $chosenDir
-    $tree heading \#0 -text $chosenDir
-
-    place_dlg .browser $parent
-    tkwait window .browser
-    return $::dialog_ans
-  }; # choose_dir
-
-}; # if not windows
-
-
-# browse for a directory and store in entry- or label widget $w
-proc dirbrowser2widget {w} {
-  set wclass [winfo class $w]
-  if {$wclass eq "Entry" || $wclass eq "TEntry"} {
-    set is_entry 1
-  } elseif {$wclass eq "Label" || $wclass eq "TLabel"} {
-    set is_entry 0
-  } else {
-    err_exit "browse2widget invoked with unsupported widget class $wclass"
-  }
-  if $is_entry {
-    set retval [$w get]
-  } else {
-    set retval [$w cget -text]
-  }
-  if {$::tcl_platform(platform) eq "unix"} {
-    set retval [choose_dir $retval [winfo parent $w]]
-  } else {
-    set retval [tk_chooseDirectory \
-                    -initialdir $retval -title [__ "Select or type"]]
-  }
-  if {$retval eq ""} {
-    return 0
-  } else {
-    if {$wclass eq "Entry" || $wclass eq "TEntry"} {
-      $w delete 0 end
-      $w insert 0 $retval
-    } else {
-      $w configure -text $retval
-    }
-    return 1
-  }
-}
-
 ##########################################################
 
 ##### installation root #####
@@ -678,7 +345,7 @@
   update_full_path
 } ; # toggle_rel
 
-proc canonical_local {} {
+proc commit_canonical_local {} {
   if {[file tail $::vars(TEXDIR)] eq $::release_year} {
     set l [file dirname $::vars(TEXDIR)]
   } else {
@@ -694,7 +361,7 @@
   set ::vars(TEXDIR) [forward_slashify [.tltd.path_l cget -text]]
   set ::vars(TEXMFSYSVAR) "$::vars(TEXDIR)/texmf-var"
   set ::vars(TEXMFSYSCONFIG) "$::vars(TEXDIR)/texmf-var"
-  canonical_local
+  commit_canonical_local
 
   if {$::vars(instopt_portable)} reset_personal_dirs
   destroy .tltd
@@ -726,9 +393,11 @@
   # path components, as labels
   incr rw
   pgrid [ttk::label .tltd.prefix_l] -in .tltd.fr1 -row $rw -column 0
-  pgrid [ttk::label .tltd.sep0_l -text $::sep] -in .tltd.fr1 -row $rw -column 1
+  pgrid [ttk::label .tltd.sep0_l -text [file separator]] \
+      -in .tltd.fr1 -row $rw -column 1
   pgrid [ttk::label .tltd.name_l] -in .tltd.fr1 -row $rw -column 2
-  pgrid [ttk::label .tltd.sep1_l -text $::sep] -in .tltd.fr1 -row $rw -column 3
+  pgrid [ttk::label .tltd.sep1_l -text [file separator]] \
+      -in .tltd.fr1 -row $rw -column 3
   pgrid [ttk::label .tltd.rel_l -width 6] \
       -in .tltd.fr1 -row $rw -column 4
   # corresponding buttons
@@ -792,7 +461,7 @@
   if {$initdir eq "" || \
           ($::tcl_platform(platform) eq "windows" && \
                [string index $initdir end] eq ":")} {
-    append initdir $::sep
+    append initdir [file separator]
   }
   .tltd.prefix_l configure -text $initdir
   update_full_path
@@ -836,22 +505,22 @@
   # below, ensure that $v is evaluated while the interface is built:
   # the variable won't be available to the button callback
   # quoted string rather than curly braces
-  ttk::button .td.ok -text [__ "Ok"] -command \
-      "set ::vars($d) [forward_slashify [.td.e get]]; end_dlg 1 .td ."
+  ttk::button .td.ok -text [__ "Ok"] -command {end_dlg [.td.e get] .td}
   ppack .td.ok -in .td.f -side right
-  ttk::button .td.cancel -text [__ "Cancel"] -command {end_dlg 0 .td .}
+  ttk::button .td.cancel -text [__ "Cancel"] -command {end_dlg "" .td}
   ppack .td.cancel -in .td.f -side right
 
   place_dlg .td .
   tkwait window .td
-  #tk_messageBox -message $::dialog_ans
-  #return $::dialog_ans
+  if {$::dialog_ans ne ""} {set ::vars($d) $::dialog_ans}
 }
 
 proc toggle_port {} {
   set ::vars(instopt_portable) [expr {!$::vars(instopt_portable)}]
-  .dirportvl configure -text [yes_no $::vars(instopt_portable)]
-  canonical_local
+  set yn [yes_no $::vars(instopt_portable)]
+  .dirportvl configure -text $yn
+#  .dirportvl configure -text [yes_no $::vars(instopt_portable)]
+  commit_canonical_local
   if {$::vars(instopt_portable)} {
     set ::vars(TEXMFHOME) $::vars(TEXMFLOCAL)
     set ::vars(TEXMFVAR) $::vars(TEXMFSYSVAR)
@@ -879,6 +548,7 @@
       }
     } else {
       set ::vars(instopt_adjustpath) 0
+      .symspec state disabled
       .pathb state disabled
       .pathl configure -foreground $::gry
     }
@@ -910,6 +580,7 @@
     } else {
       # set ::vars(instopt_adjustpath) 0
       # leave false, still depends on symlink paths
+      .symspec state !disabled
       if [dis_enable_symlink_option] {
         .pathb state !disabled
         .pathl configure -foreground $::blk
@@ -926,7 +597,7 @@
   # n. of additional platforms
   if [winfo exists .binlm] {
     if {$::vars(n_systems_selected) < 2} {
-      .binlm configure -text "None"
+      .binlm configure -text [__ "None"]
     } else {
       .binlm configure -text [expr {$::vars(n_systems_selected) - 1}]
     }
@@ -938,6 +609,9 @@
              $::vars(n_collections_selected) \
              $::vars(n_collections_available)]
   }
+  if [winfo exists .schml] {
+    .schml configure -text [__ $::scheme_descs($::vars(selected_scheme))]
+  }
   # diskspace: can use -textvariable here
   # paper size
 }; # show_stats
@@ -1016,14 +690,12 @@
   # ok, cancel buttons
   pack [ttk::frame .tlbin.buts] -in .tlbin.bg -expand 1 -fill x
   ttk::button .tlbin.ok -text [__ "Ok"] -command \
-      {save_bin_selections; update_vars; end_dlg 1 .tlbin .}
+      {save_bin_selections; update_vars; end_dlg 1 .tlbin}
   ppack .tlbin.ok -in .tlbin.buts -side right
-  ttk::button .tlbin.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlbin .}
+  ttk::button .tlbin.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlbin}
   ppack .tlbin.cancel -in .tlbin.buts -side right
 
   place_dlg .tlbin .
-  tkwait window .tlbin
-  return $::dialog_ans
 }; # select_binaries
 
 #############################################################
@@ -1067,15 +739,13 @@
     }
     update_vars
     show_stats
-    end_dlg 1 .tlschm .
+    end_dlg 1 .tlschm
   }
   ppack .tlschm.ok -in .tlschm.buts -side right
-  ttk::button .tlschm.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlschm .}
+  ttk::button .tlschm.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlschm}
   ppack .tlschm.cancel -in .tlschm.buts -side right
 
   place_dlg .tlschm .
-  tkwait window .tlschm
-  return $::dialog_ans
 }; # select_scheme
 
 #############################################################
@@ -1109,11 +779,11 @@
 }; # save_coll_selections
 
 proc select_collections {} {
-  # 2017: more than 40 collections
-  # The tcl installer acquires collections from the database file,
+  # 2018: more than 40 collections
+  # The tcl installer acquires collections from install-menu-extl.pl,
   # but install-tl also has an array of collections.
-  # Use treeview for checkbox column and collection descriptions
-  # rather than names.
+  # Use treeview for checkbox column and display of
+  # collection descriptions rather than names.
   # buttons: select all, select none, ok, cancel
   # should some collections be excluded? Check install-menu-* code.
   create_dlg .tlcoll .
@@ -1185,15 +855,13 @@
       }
   ppack .tlcoll.none -in .tlcoll.butf -side left
   ttk::button .tlcoll.ok -text [__ "Ok"] -command \
-      {save_coll_selections; end_dlg 1 .tlcoll .}
+      {save_coll_selections; end_dlg 1 .tlcoll}
   ppack .tlcoll.ok -in .tlcoll.butf -side right
-  ttk::button .tlcoll.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlcoll .}
+  ttk::button .tlcoll.cancel -text [__ "Cancel"] -command {end_dlg 0 .tlcoll}
   ppack .tlcoll.cancel -in .tlcoll.butf -side right
 
   place_dlg .tlcoll .
   wm resizable .tlcoll 0 0
-  tkwait window .tlcoll
-  return $::dialog_ans
 }; # select_collections
 
 ##################################################
@@ -1326,15 +994,13 @@
     # ok, cancel
     pack [ttk::frame .edsyms.fr1] -expand 1 -fill both
     ppack [ttk::button .edsyms.ok -text [__ "Ok"] -command {
-      commit_sym_entries; end_dlg 1 .edsyms .}] -in .edsyms.fr1 -side right
+      commit_sym_entries; end_dlg 1 .edsyms}] -in .edsyms.fr1 -side right
     ppack [ttk::button .edsyms.cancel -text [__ "Cancel"] -command {
-      end_dlg 0 .edsyms .}] -in .edsyms.fr1 -side right
+      end_dlg 0 .edsyms}] -in .edsyms.fr1 -side right
 
     check_sym_entries
 
     place_dlg .edsyms .
-    tkwait window .edsyms
-    return
   }
 }
 
@@ -1486,7 +1152,7 @@
     incr rw
     pgrid [ttk::label .schmll -text [__ "Scheme:"]] \
         -in .selsf -row $rw -column 0 -sticky w
-    pgrid [ttk::label .schml -textvariable ::vars(selected_scheme)] \
+    pgrid [ttk::label .schml -text ""] \
         -in .selsf -row $rw -column 1 -sticky w
     pgrid [ttk::button .schmb -text [__ "Change"] -command select_scheme] \
         -in .selsf -row $rw -column 2 -sticky e
@@ -1511,7 +1177,7 @@
   pgrid .size_req -in $curf -row $rw -column 1 -sticky w
 
   ########################################################
-  # right: options
+  # right side: options
   # 3 columns. Column 1 can be merged with either 0 or 2.
 
   if $::advanced {
@@ -1907,7 +1573,7 @@
   } else {
     log_exit
   }
-}
+}; # main_prog
 
 file delete $::dblfile
 

Modified: trunk/Master/tlpkg/installer/install-tl-windows.cmd
===================================================================
--- trunk/Master/tlpkg/installer/install-tl-windows.cmd	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/installer/install-tl-windows.cmd	2018-10-20 09:17:47 UTC (rev 48955)
@@ -43,19 +43,11 @@
 set args=
 goto rebuildargs
 
-rem check for a gui- and lang arguments
-rem handle them here and do not pass them on to perl or tcl.
+rem check for a gui argument
+rem handle it here and do not pass it on to perl or tcl.
 rem cmd.exe converts '=' to a space:
 rem '-parameter=value' becomes '-parameter value': two arguments
 
-rem code block for language argument
-:dolang
-shift
-if "%0" == "" goto nomoreargs
-set LANG=%0
-set LC_ALL=
-goto rebuildargs
-
 rem code block for gui argument
 :dogui
 if x%1 == x (
@@ -93,9 +85,6 @@
 shift
 if x%0 == x goto nomoreargs
 set p=%0
-if %p% == --lang goto dolang
-if %p% == -lang goto dolang
-
 if %p% == -print-platform set tcl=no
 if %p% == --print-platform set tcl=no
 if %p% == -version set tcl=no
@@ -128,7 +117,6 @@
 rem Since reg.exe may be disabled by e.g. company policy,
 rem tcl will yet consult the registry if LANG is not set,
 rem although under some circumstances this may cause a long delay.
-goto endreg
 if %tcl% == no goto endreg
 if not x%LANG% == x goto endreg
 rem reg.exe runnable by user?

Modified: trunk/Master/tlpkg/installer/install-tl.sh
===================================================================
--- trunk/Master/tlpkg/installer/install-tl.sh	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/installer/install-tl.sh	2018-10-20 09:17:47 UTC (rev 48955)
@@ -1,4 +1,4 @@
-#! /bin/sh
+#!/bin/sh
 
 # default: tcl gui or not
 if test `uname -s` = Darwin; then
@@ -9,13 +9,10 @@
 # are there reasons not to use the tcl gui?
 notcl=no
 
-args=''
-
 unset wait_for_gui
-unset wait_for_lang
 unset gui_set
 
-# We need "$@ syntax because some paramters may contain spaces.
+# We need "$@" syntax because some parameters may contain spaces.
 # In order to make use of this syntax we must pass along ALL parameters.
 for p in "$@"; do
   # TODO: sanitize $p; abort if necessary
@@ -23,12 +20,10 @@
     -tcl | --tcl)
       if test $gui_set; then echo Gui set more than once; exit 1; fi
       gui_set=1
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
       unset wait_for_gui
       tcl=yes
       ;;
     -print-platform | --print-platform | -version | --version)
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
       unset wait_for_gui
       notcl=yes
       ;;
@@ -35,7 +30,6 @@
     -gui | --gui)
       if test $gui_set; then echo Gui set more than once; exit 1; fi
       gui_set=1
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
       tcl=yes
       wait_for_gui=1
       ;;
@@ -42,7 +36,6 @@
     --gui=* | -gui=*)
       if test $gui_set; then echo Gui set more than once; exit 1; fi
       gui_set=1
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
       if test $p = -gui=text -o $p = --gui=text; then
         tcl=no
       else
@@ -51,27 +44,9 @@
       unset wait_for_gui
       ;;
     -no-gui | --no-gui)
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
       unset wait_for_gui
       notcl=yes
       ;;
-    -lang | --lang)
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
-      unset wait_for_gui
-      wait_for_lang=1
-      ;;
-    -lang=*)
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
-      unset wait_for_gui
-      LANG=$p
-      LANG=${LANG#-lang=}
-      ;;
-    --lang=*)
-      if test $wait_for_lang; then echo Language code expected; exit 1; fi
-      unset wait_for_gui
-      LANG=$p
-      LANG=${LANG#--lang=}
-      ;;
     *)
       if test $wait_for_gui; then
         if test $p = text; then
@@ -81,10 +56,6 @@
         fi
         unset wait_for_gui
       fi
-      if test $wait_for_lang; then
-        LANG=$p
-        unset wait_for_lang
-      fi
       ;;
   esac
 done
@@ -92,11 +63,6 @@
   tcl=no
 fi
 
-export LANG
-LC_MESSAGES=$LANG
-export LC_MESSAGES
-unset LC_ALL
-
 # silence perl locale warnings
 PERL_BADLANG=0
 export PERL_BADLANG
@@ -103,10 +69,10 @@
 
 # We can safely pass all original parameters to perl:
 # In install-tl[.pl], from_ext_gui will overrule the gui parameter.
-# The lang parameter will not come into play in either perl or tcl.
+# The lang parameter will be handled by tcl and not come into play in perl
 
 if test "$tcl" = "yes"; then
-  exec wish `dirname $0`/install-tl-gui.tcl -- "$@"
+  wish `dirname $0`/install-tl-gui.tcl -- "$@" &
 else
-  exec perl `dirname $0`/../../install-tl "$@"
+  perl `dirname $0`/../../install-tl "$@"
 fi

Modified: trunk/Master/tlpkg/translations/nl.msg
===================================================================
--- trunk/Master/tlpkg/translations/nl.msg	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/translations/nl.msg	2018-10-20 09:17:47 UTC (rev 48955)
@@ -1,5 +1,5 @@
-set ::msgcat::header "Project-Id-Version: TeX Live translation\nReport-Msgid-Bugs-To: tex-live at tug.org\nPOT-Creation-Date: 2018-09-28 02:23+0200\nPO-Revision-Date: 2018-08-24 12:59+0200\nLast-Translator: Siep Kroonenberg <siepo at cybercomm.nl>\nLanguage-Team: TL Translation Team <tex-live at tug.org>\nLanguage: nl\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nX-Poedit-SourceCharset: UTF-8\nX-Generator: Poedit 2.0.6\n"
-::msgcat::mcset nl "Installation process" "Installatie"
+set ::msgcat::header "Project-Id-Version: TeX Live translation\nReport-Msgid-Bugs-To: tex-live at tug.org\nPO-Revision-Date: 2018-10-19 20:30+0200\nLast-Translator: Siep Kroonenberg <siepo at cybercomm.nl>\nLanguage-Team: TL Translation Team <tex-live at tug.org>\nLanguage: nl\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nX-Poedit-SourceCharset: UTF-8\nX-Generator: Poedit 2.0.6\n"
+::msgcat::mcset nl "Installation process" "Installatie-proces"
 ::msgcat::mcset nl "Cancel" "Afbreken"
 ::msgcat::mcset nl "Scroll back to inspect warnings" "Schuif terug om waarschuwingen te inspekteren"
 ::msgcat::mcset nl "Finish" "Sluit af"
@@ -33,12 +33,12 @@
 ::msgcat::mcset nl "Could not load remote TeX Live Database:" "Kon de online TeX Live database niet laden:"
 ::msgcat::mcset nl "Please go back and select a different mirror." "Ga terug en kies een andere mirror."
 ::msgcat::mcset nl "The TeX Live versions of the local installation\nand the repository being accessed are not compatible:\n     local: %s\nrepository: %s" "De TeX Live versies van de lokale installatie\nen van de gebruikte installatie-bron zijn niet compatibel:\n  lokaal: %s\n  installatie-bron:%s"
-::msgcat::mcset nl "Destination folder:" "Bestemmings-folder"
+::msgcat::mcset nl "Destination folder:" "Bestemmings-folder:"
 ::msgcat::mcset nl "Change" "Wijzig"
 ::msgcat::mcset nl "The destination folder will contain the installation.\nIt is strongly recommended to keep the year as the last component." "De bestemmings-folder zal TeX Live bevatten.\nHet wordt sterk aangeraden het jaar aan te houden als laatste component."
-::msgcat::mcset nl "disk space required:" "benodigde schijfruimte"
+::msgcat::mcset nl "disk space required:" "benodigde schijfruimte:"
 ::msgcat::mcset nl "(default not allowed or not writable - please change!)" "(default niet toegestaan of niet schrijfbaar - aub wijzigen!)"
-::msgcat::mcset nl "This screen allows you to configure some options" "Met dit scherm kunt u enkele opties instellen."
+::msgcat::mcset nl "This screen allows you to configure some options" "Met dit scherm kunt u enkele opties instellen"
 ::msgcat::mcset nl "We are ready to install TeX Live %s.\nThe following settings will be used.\nIf you want to change something please go back,\notherwise press the \"Install\" button." "We zijn gereed om TeX Live %s te installeren.\nDe volgende instellingen worden gebruikt.\nGa terug als u iets wilt wijzigen,\nzo niet, klik dan op de \"Installeren\" knop."
 ::msgcat::mcset nl "Yes" "Ja"
 ::msgcat::mcset nl "No" "Nee"
@@ -84,11 +84,11 @@
 ::msgcat::mcset nl "Right-click install-tl-advanced and select \"run as administrator\"\n if you want to install for all users." "Rechts-klik install-tl-advanced en selekteer \"Als administrator uitvoeren\"\nals u voor alle gebruikers wilt installeren."
 ::msgcat::mcset nl "Change variable value" "Nieuwe waarde"
 ::msgcat::mcset nl "Enter path for %s (use ~ for %s)" "Pad voor %s (gebruik ~ voor %s)"
-::msgcat::mcset nl "custom selection of collections" "Eigen selektie van collekties"
+::msgcat::mcset nl "custom selection of collections" "eigen selektie van collekties"
 ::msgcat::mcset nl "Select the collections to be installed" "Kies te installeren collecties"
 ::msgcat::mcset nl "Select All" "Kies alles"
 ::msgcat::mcset nl "Deselect All" "Kies niets"
-::msgcat::mcset nl "create symlinks in standard directories" "Maak symlinks naar standaard-folders"
+::msgcat::mcset nl "create symlinks in standard directories" "maak symlinks naar standaard-folders"
 ::msgcat::mcset nl "binaries to" "programma's naar"
 ::msgcat::mcset nl "manpages to" "manpages naar"
 ::msgcat::mcset nl "info to" "info naar"
@@ -103,10 +103,10 @@
 ::msgcat::mcset nl "This may take some time, please be patient ..." "Dit kan even duren; even geduld aub..."
 ::msgcat::mcset nl "... done loading" "... klaar met laden"
 ::msgcat::mcset nl "You don't have permissions to change the installation in any way;\nspecifically, the directory %s is not writable.\nPlease run this program as administrator, or contact your local admin.\n\nMost buttons will be disabled." "U heeft geen rechten om de installatie op enige manier te wijzigen;\nin het bijzonder heeft u geen schrijfrechten voor de %s folder.\nVoer dit programma uit als administrator of neem contact op\nmet systeembeheer.\n\nDe meeste knoppen zijn gedeactiveerd."
-::msgcat::mcset nl "Repository" "installatie-bron"
+::msgcat::mcset nl "Repository" "Installatie-bron"
 ::msgcat::mcset nl "Loaded:" "Geladen:"
-::msgcat::mcset nl "none" "Geen"
-::msgcat::mcset nl "Load default" "Laad standaard installatie-bron."
+::msgcat::mcset nl "none" "geen"
+::msgcat::mcset nl "Load default" "Laad standaard installatie-bron"
 ::msgcat::mcset nl "multiple repositories" "meerdere installatie-bronnen"
 ::msgcat::mcset nl "Default:" "Standaard:"
 ::msgcat::mcset nl "Display configuration" "Laat instellingen zien"
@@ -118,7 +118,7 @@
 ::msgcat::mcset nl "Category" "Categorie"
 ::msgcat::mcset nl "packages" "pakketten"
 ::msgcat::mcset nl "collections" "collecties"
-::msgcat::mcset nl "schemes" "Schema's"
+::msgcat::mcset nl "schemes" "schema's"
 ::msgcat::mcset nl "Match" "Match"
 ::msgcat::mcset nl "descriptions" "beschrijvingen"
 ::msgcat::mcset nl "filenames" "bestandsnamen"
@@ -140,7 +140,7 @@
 ::msgcat::mcset nl "Actions" "Akties"
 ::msgcat::mcset nl "Help" "Help"
 ::msgcat::mcset nl "Load default (from tlpdb) repository:" "Laad standaard (volgens tlpdb) installatie-bron:"
-::msgcat::mcset nl "Load cmd line repository:" "Laad cmd line installatie-bron."
+::msgcat::mcset nl "Load cmd line repository:" "Laad cmd line installatie-bron:"
 ::msgcat::mcset nl "Load standard net repository:" "Laad standaard online installatie-bron:"
 ::msgcat::mcset nl "Load other repository ..." "Laad andere bron ..."
 ::msgcat::mcset nl "General ..." "Algemeen ..."
@@ -165,7 +165,7 @@
 ::msgcat::mcset nl "Package:" "Pakket:"
 ::msgcat::mcset nl "Category:" "Categorie:"
 ::msgcat::mcset nl "Short description:" "Korte beschrijving:"
-::msgcat::mcset nl "Long description:" "Lange beschrijving;"
+::msgcat::mcset nl "Long description:" "Lange beschrijving:"
 ::msgcat::mcset nl "Installed:" "Ge\u00efnstalleerd:"
 ::msgcat::mcset nl "Local revision:" "Lokale revisie:"
 ::msgcat::mcset nl "Local Catalogue version:" "Versie lokale catalogus:"
@@ -173,8 +173,8 @@
 ::msgcat::mcset nl "Remote Catalogue version:" "Versie online catalogus:"
 ::msgcat::mcset nl "Keywords:" "Trefwoorden:"
 ::msgcat::mcset nl "Functionality:" "Funktionaliteit:"
-::msgcat::mcset nl "Primary characterization:" "Primaire omschrijving"
-::msgcat::mcset nl "Secondary characterization:" "Secundaire omschrijving"
+::msgcat::mcset nl "Primary characterization:" "Primaire omschrijving:"
+::msgcat::mcset nl "Secondary characterization:" "Secundaire omschrijving:"
 ::msgcat::mcset nl "Collection:" "Collectie:"
 ::msgcat::mcset nl "Warning: Catalogue versions might be lagging behind or be simply wrong." "Waarschuwing: Catalogus versies kunnen achterlopen of niet kloppen."
 ::msgcat::mcset nl "Depends:" "Hangt af van:"
@@ -187,7 +187,7 @@
 ::msgcat::mcset nl "Update the TeX Live Manager" "Werk TeX Live Manager bij"
 ::msgcat::mcset nl "Select platforms to support" "Keuze van te ondersteunen platforms"
 ::msgcat::mcset nl "Apply changes" "Voer de wijzigingen uit"
-::msgcat::mcset nl "General options" "Algemene opties:"
+::msgcat::mcset nl "General options" "Algemene opties"
 ::msgcat::mcset nl "Default package repository" "Standaard installatie-bron"
 ::msgcat::mcset nl "Create formats on installation" "Genereer formaten tijdens installatie"
 ::msgcat::mcset nl "Install macro/font sources" "Installeer bronbestanden voor macros/lettertypen"
@@ -197,9 +197,9 @@
 ::msgcat::mcset nl "Link destination for programs" "Doelfolder voor programma-symlinks"
 ::msgcat::mcset nl "Link destination for info docs" "Doelfolder voor symlinks info-bestanden"
 ::msgcat::mcset nl "Link destination for man pages" "Doelfolder voor symlinks man paginas"
-::msgcat::mcset nl "Create shortcuts on the desktop" "Maak snelkoppelingen op het bureaublad."
+::msgcat::mcset nl "Create shortcuts on the desktop" "Maak snelkoppelingen op het bureaublad"
 ::msgcat::mcset nl "Install for all users" "Installeer voor alle gebruikers"
-::msgcat::mcset nl "Load default repository:" "Laad standaard installatie-bron."
+::msgcat::mcset nl "Load default repository:" "Laad standaard installatie-bron:"
 ::msgcat::mcset nl "Paper options" "Papier instellingen"
 ::msgcat::mcset nl "Default paper for all" "Standaard papier-formaat voor alle"
 ::msgcat::mcset nl "a4" "a4"
@@ -206,9 +206,9 @@
 ::msgcat::mcset nl "Default paper for" "Standaard papier-formaat voor"
 ::msgcat::mcset nl "GUI Language" "GUI taal"
 ::msgcat::mcset nl "System default" "Systeem-instelling"
-::msgcat::mcset nl "Default language for GUI:" "Standaard-taal voor de GUI"
+::msgcat::mcset nl "Default language for GUI:" "Standaard-taal voor de GUI:"
 ::msgcat::mcset nl "Changes will take effect after restart" "Wijzigingen treden in werking na herstart"
-::msgcat::mcset nl "Choose directory" "Kies folder:"
+::msgcat::mcset nl "Choose directory" "Kies folder"
 ::msgcat::mcset nl "Edit default package repositories" "Wijzig de standaard installatie-bronnen voor pakketten"
 ::msgcat::mcset nl "Specify set of repositories to be used" "Kies de te gebruiken installatie-bronnen"
 ::msgcat::mcset nl "Delete" "Verwijder"
@@ -221,7 +221,7 @@
 ::msgcat::mcset nl "Select paper format for" "Selekteer papier-formaat voor"
 ::msgcat::mcset nl "keep arbitrarily many" "bewaar een onbeperkt aantal"
 ::msgcat::mcset nl "disable" "deactiveer"
-::msgcat::mcset nl "Loading of remote database failed." "Laden van online database mislukt"
+::msgcat::mcset nl "Loading of remote database failed." "Laden van online database mislukt."
 ::msgcat::mcset nl "Error message:" "Foutmelding:"
 ::msgcat::mcset nl "Installation" "Installatie"
 ::msgcat::mcset nl "Critical updates have been installed.\nProgram will terminate now.\nPlease restart if necessary." "Kern-onderdelen zijn bijgewerkt.\nHet programma zal nu afsluiten.\nHerstart indien nodig."
@@ -248,7 +248,6 @@
 ::msgcat::mcset nl "not verified" "niet geverifieerd"
 ::msgcat::mcset nl "Completed" "Klaar"
 ::msgcat::mcset nl "Running %s failed.\nPlease consult the log window for details." "%s is met een fout geeindigd.\nRaadpleeg het log venster voor details."
-::msgcat::mcset nl "Error" "Fout"
 ::msgcat::mcset nl "Welcome to TeX Live!" "Welkom bij TeX Live!"
 ::msgcat::mcset nl "See %s/index.html for links to documentation.\nThe TeX Live web site (http://tug.org/texlive/) contains any updates and corrections. TeX Live is a joint project of the TeX user groups around the world; please consider supporting it by joining the group best for you. The list of groups is available on the web at http://tug.org/usergroups.html." "Zie %s/index.html voor links naar documentatie.\nDe TeX Live web site (http://tug.org/texlive/) bevat\neventuele updates en correcties.\nTeX Live is een gezamenlijk projekt van TeX gebruikersgroepen wereldwijd;\noverweeg ondersteuning door lid te worden van zo'n groep.\nDe lijst van gebruikersgroepen staat op http://tug.org/usergroups.html."
 ::msgcat::mcset nl "Add %s/texmf-dist/doc/man to MANPATH.\nAdd %s/texmf-dist/doc/info to INFOPATH.\nMost importantly, add %s/bin/%s\nto your PATH for current and future sessions." "Voeg %s/texmf-dist/doc/man toe aan MANPATH.\nVoeg %s/texmf-dist/doc/info toe aan INFOPATH.\nEn bovenal, voeg %s/bin/%s\ntoe aan PATH voor huidige en toekomstige sessies."
@@ -256,8 +255,6 @@
 ::msgcat::mcset nl "Unexpected closed backend" "Achtergrond-proces onverwacht beeindigd"
 ::msgcat::mcset nl "TeX Live Installer" "TeX Live Installatie"
 ::msgcat::mcset nl "Loading..." "Laden..."
-::msgcat::mcset nl "Browse..." "Bladeren..."
-::msgcat::mcset nl "Select or type" "Kies of type"
 ::msgcat::mcset nl "Cannot be created or cannot be written to" "Kan niet worden aangemaakt of is niet schrijfbaar"
 ::msgcat::mcset nl "Directory name..." "Folder-naam..."
 ::msgcat::mcset nl "Change name (slashes not allowed)" "Wijzig naam (slashes niet toegestaan)"
@@ -264,8 +261,10 @@
 ::msgcat::mcset nl "No slashes allowed" "Slashes niet toegestaan"
 ::msgcat::mcset nl "TL release component highly recommended!\nAre you sure?" "TL jaar component sterk aanbevolen!\nWeet u het zeker?"
 ::msgcat::mcset nl "Installation root" "Hoofd TeX-folder"
+::msgcat::mcset nl "Browse..." "Bladeren..."
 ::msgcat::mcset nl "Toggle year" "Jaar component aan/uit"
 ::msgcat::mcset nl "Localized directory names will be replaced by their real names" "Aangepaste folder-namen worden vervangen door hun werkelijke namen"
+::msgcat::mcset nl "'~' equals %s, e.g. %s" "'~' betekent %s, bijvoorbeeld %s"
 ::msgcat::mcset nl "Cannot deselect own platform" "Eigen platform is altijd geselecteerd"
 ::msgcat::mcset nl "Binaries" "Binaries"
 ::msgcat::mcset nl "Schemes" "Schema's"
@@ -274,7 +273,7 @@
 ::msgcat::mcset nl "Other collections" "Andere collecties"
 ::msgcat::mcset nl "Warning. Not all configured directories are writable!" "Waarschuwing. Niet alle geconfigureerde folders zijn schrijfbaar!"
 ::msgcat::mcset nl "Symlinks" "Symlinks"
-::msgcat::mcset nl "browse..." "Bladeren..."
+::msgcat::mcset nl "browse..." "bladeren..."
 ::msgcat::mcset nl "Man pages" "Man pagina's"
 ::msgcat::mcset nl "Info pages" "Info pagina's"
 ::msgcat::mcset nl "TeX Live %s Installer" "TeX Live %s Installatie"
@@ -294,12 +293,104 @@
 ::msgcat::mcset nl "Desktop integration" "Bureaublad-integratie"
 ::msgcat::mcset nl "File associations" "Koppeling bestandsformaten"
 ::msgcat::mcset nl "Specify directories" "Specificeer folders"
+::msgcat::mcset nl "Select or type" "Kies of type"
+::msgcat::mcset nl "ok" "ok"
+::msgcat::mcset nl "yes" "ja"
+::msgcat::mcset nl "no" "nee"
+::msgcat::mcset nl "cancel" "afbreken"
+::msgcat::mcset nl "IDLE" "INACTIEF"
+::msgcat::mcset nl "BUSY" "BEZIG"
+::msgcat::mcset nl "Running" "Bezig"
+::msgcat::mcset nl "Idle" "Inactief"
+::msgcat::mcset nl "Needs updating" "Moet worden bijgewerkt"
+::msgcat::mcset nl "Up to date" "Up to date"
+::msgcat::mcset nl "Unknown" "Onbekend"
+::msgcat::mcset nl "A configured repository is unavailable." "Een ingestelde installatie-bron is niet beschikbaar."
+::msgcat::mcset nl "Output" "Uitvoer"
+::msgcat::mcset nl "Errors" "Fouten"
+::msgcat::mcset nl "%s not a repository" "%s is geen installatie-bron"
+::msgcat::mcset nl "Main Repository" "Primaire installatie-bron"
+::msgcat::mcset nl "Current:" "Huidig:"
+::msgcat::mcset nl "New" "Nieuw"
+::msgcat::mcset nl "Any CTAN mirror" "Willekeurige CTAN mirror"
+::msgcat::mcset nl "Specific mirror..." "Specifieke CTAN mirror..."
+::msgcat::mcset nl "Local directory..." "Lokale folder..."
+::msgcat::mcset nl "Save and Load" "Opslaan en laden"
+::msgcat::mcset nl "Abort" "Afbreken"
+::msgcat::mcset nl "Additional repositories" "Externe installatie-bronnen"
+::msgcat::mcset nl "Add tlcontrib" "Voeg tlcontrib toe"
+::msgcat::mcset nl "Packages which cannot be part of TeX Live" "Pakketten die geen onderdeel kunnen uitmaken van TeX Live"
+::msgcat::mcset nl "Tag (optional)" "Kenteken (indien gewenst)"
+::msgcat::mcset nl "Add" "Toevoegen"
+::msgcat::mcset nl "Cannot remove own platform %s" "Eigen platform %s is altijd geselecteerd"
+::msgcat::mcset nl "platform" "platform"
+::msgcat::mcset nl "Apply and close" "Toepassen en sluiten"
+::msgcat::mcset nl "Restore %s to revision %s?" "%s terugdraaien naar %s?"
+::msgcat::mcset nl "No backups configured" "Geen reserve-kopie\u00ebn geconfigureerd"
+::msgcat::mcset nl "No backup directory defined" "Geen folder voor reserve-kopie\u00ebn gedefinieerd"
+::msgcat::mcset nl "Backup directory %s does not exist" "Folder %s voor reserve-kopie\u00ebn bestaat niet"
+::msgcat::mcset nl "No packages in backup directory %s" "Geen pakketten in folder %s voor reserve-kopie\u00ebn"
+::msgcat::mcset nl "Restore from backup" "Herinstalleer vanaf reserve-kopie"
+::msgcat::mcset nl "Package" "Pakket"
+::msgcat::mcset nl "Revision" "Revisie"
+::msgcat::mcset nl "Restore all" "Herstel alle"
+::msgcat::mcset nl "Nothing to do!" "Niets te doen!"
+::msgcat::mcset nl "Update self first!" "Eerst zelf bijwerken!"
+::msgcat::mcset nl "Already installed: %s" "Al ge\u00efnstalleerd: %s"
+::msgcat::mcset nl "Also updating dependencies\n\n%s?" "Ook afhankelijkheden\n%s\nbijwerken?"
+::msgcat::mcset nl "Updating hard dependencies %s anyway. Continue?" "Harde afhankelijkheden %s worden in elk geval bijgewerkt. Doorgaan?"
+::msgcat::mcset nl "Skipped because not installed: %s" "Niet g\u00efnstalleerd: %s\novergeslagen"
+::msgcat::mcset nl "Skipped because already up to date: %s" "Overgeslagen: %s; al up to date"
+::msgcat::mcset nl "Also remove dependencies\n\n%s?" "Verwijder ook afhankelijkheden\n%s?"
+::msgcat::mcset nl "Removing hard dependencies %s anyway. Continue?" "Harde afhankelijkheden %s worden in elk geval verwijderd. Doorgaan?"
+::msgcat::mcset nl "Info" "Info"
+::msgcat::mcset nl "File" "Archief"
+::msgcat::mcset nl "Load default repository" "Laad standaard installatie-bron"
+::msgcat::mcset nl "Exit" "Einde"
+::msgcat::mcset nl "Packages" "Pakketten"
+::msgcat::mcset nl "Update tlmgr" "Werk tlmgr bij"
+::msgcat::mcset nl "Update all" "Alles bijwerken"
+::msgcat::mcset nl "Install marked" "Installeer selektie"
+::msgcat::mcset nl "Update marked" "Werk selektie bij"
+::msgcat::mcset nl "Remove marked" "Verwijder selektie"
+::msgcat::mcset nl "Restore from backup..." "Herinstalleer vanaf reserve-kopie..."
+::msgcat::mcset nl "Regenerate filename database" "Ververs database van bestandsnamen"
+::msgcat::mcset nl "Regenerating filename database..." "Bezig met verversen database..."
+::msgcat::mcset nl "Regenerate formats" "Ververs formaten"
+::msgcat::mcset nl "Rebuilding formats..." "Bezig formaten te verversen..."
+::msgcat::mcset nl "Regenerate fontmaps" "Ververs fontmaps"
+::msgcat::mcset nl "Rebuilding fontmap files..." "Bezig fontmaps te verversen.."
+::msgcat::mcset nl "Change main repository" "Wijzig primaire installatie-bron"
+::msgcat::mcset nl "Paper" "Papier"
+::msgcat::mcset nl "Default repositories" "Ingestelde installatie-bronnen"
+::msgcat::mcset nl "Not loaded" "Niet geladen"
+::msgcat::mcset nl "TL Manager up to date?" "TL Manager up to date?"
+::msgcat::mcset nl "Last tlmgr command:" "Laatste tlmgr opdracht:"
+::msgcat::mcset nl "Type command:" "Typ opdracht:"
+::msgcat::mcset nl "Go" "Uitvoeren"
+::msgcat::mcset nl "Package list" "Lijst van pakketten"
+::msgcat::mcset nl "Installed" "Ge\u00efnstalleerd"
+::msgcat::mcset nl "Updatable" "Nieuwe versie"
+::msgcat::mcset nl "Detail >> Global" "Detail >> Globaal"
+::msgcat::mcset nl "Collections and schemes" "Collecties en schemas"
+::msgcat::mcset nl "Only schemes" "Alleen schemas"
+::msgcat::mcset nl "Mark all" "Kies alles"
+::msgcat::mcset nl "Mark none" "Kies niets"
+::msgcat::mcset nl "Search package names" "Zoek op naam pakket"
+::msgcat::mcset nl "Also search short descriptions" "Zoek ook in korte beschrijvingen"
+::msgcat::mcset nl "Name" "Naam"
+::msgcat::mcset nl "Local Rev. (ver.)" "Lokale rev. (ver.)"
+::msgcat::mcset nl "Remote Rev. (ver.)" "Online rev. (ver.)"
+::msgcat::mcset nl "Description" "Beschrijving"
+::msgcat::mcset nl "Restart self" "Herstart zelf"
+::msgcat::mcset nl "Restart tlmgr" "Herstart tlmgr"
+::msgcat::mcset nl "Show logs" "Toon logs"
 ::msgcat::mcset nl "basic scheme (plain and latex)" "basis-schema (Plain en latex)"
 ::msgcat::mcset nl "ConTeXt scheme" "ConTeXt schema"
-::msgcat::mcset nl "full scheme (everything)" "Volledig schema (alles)"
+::msgcat::mcset nl "full scheme (everything)" "volledig schema (alles)"
 ::msgcat::mcset nl "GUST TeX Live scheme" "GUST TeX Live schema"
-::msgcat::mcset nl "infrastructure-only scheme (no TeX at all)" "Alleen infrastruktuur (helemaal geen TeX)"
-::msgcat::mcset nl "medium scheme (small + more packages and languages)" "Medium schema (klein + meer pakketten en taken)"
+::msgcat::mcset nl "infrastructure-only scheme (no TeX at all)" "alleen infrastruktuur (helemaal geen TeX)"
+::msgcat::mcset nl "medium scheme (small + more packages and languages)" "medium schema (klein + meer pakketten en taken)"
 ::msgcat::mcset nl "minimal scheme (plain only)" "minimum schema (alleen plain)"
 ::msgcat::mcset nl "small scheme (basic + xetex, metapost, a few languages)" "klein schema (basis + xetex, metapost, enkele talen)"
 ::msgcat::mcset nl "teTeX scheme (more than medium, but nowhere near full)" "teTeX schema (meer dan medium, maar lang niet alles)"

Modified: trunk/Master/tlpkg/translations/nl.po
===================================================================
--- trunk/Master/tlpkg/translations/nl.po	2018-10-20 07:22:17 UTC (rev 48954)
+++ trunk/Master/tlpkg/translations/nl.po	2018-10-20 09:17:47 UTC (rev 48955)
@@ -2,8 +2,8 @@
 msgstr ""
 "Project-Id-Version: TeX Live translation\n"
 "Report-Msgid-Bugs-To: tex-live at tug.org\n"
-"POT-Creation-Date: 2018-09-28 02:23+0200\n"
-"PO-Revision-Date: 2018-08-24 12:59+0200\n"
+"POT-Creation-Date: 2018-10-19 20:15+0200\n"
+"PO-Revision-Date: 2018-10-19 20:30+0200\n"
 "Last-Translator: Siep Kroonenberg <siepo at cybercomm.nl>\n"
 "Language-Team: TL Translation Team <tex-live at tug.org>\n"
 "Language: nl\n"
@@ -15,7 +15,7 @@
 
 #: tlpkg/installer/tracked-install.pl:27
 msgid "Installation process"
-msgstr "Installatie"
+msgstr "Installatie-proces"
 
 #: tlpkg/installer/tracked-install.pl:41
 #: tlpkg/installer/install-menu-wizard.pl:383
@@ -40,15 +40,15 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2469
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2506
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2587
-#: tlpkg/installer/install-tl-gui.tcl:414
-#: tlpkg/installer/install-tl-gui.tcl:530
-#: tlpkg/installer/install-tl-gui.tcl:657
-#: tlpkg/installer/install-tl-gui.tcl:757
-#: tlpkg/installer/install-tl-gui.tcl:842
-#: tlpkg/installer/install-tl-gui.tcl:1021
-#: tlpkg/installer/install-tl-gui.tcl:1073
-#: tlpkg/installer/install-tl-gui.tcl:1190
-#: tlpkg/installer/install-tl-gui.tcl:1330
+#: tlpkg/installer/install-tl-gui.tcl:240
+#: tlpkg/installer/install-tl-gui.tcl:324
+#: tlpkg/installer/install-tl-gui.tcl:426
+#: tlpkg/installer/install-tl-gui.tcl:510
+#: tlpkg/installer/install-tl-gui.tcl:695
+#: tlpkg/installer/install-tl-gui.tcl:745
+#: tlpkg/installer/install-tl-gui.tcl:860
+#: tlpkg/installer/install-tl-gui.tcl:998 tlpkg/TeXLive/tltcl.tcl:359
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1199
 msgid "Cancel"
 msgstr "Afbreken"
 
@@ -62,7 +62,7 @@
 
 #: tlpkg/installer/install-menu-wizard.pl:41
 #: tlpkg/installer/install-menu-perltk.pl:445
-#: tlpkg/installer/install-tl-gui.tcl:1536
+#: tlpkg/installer/install-tl-gui.tcl:1202
 msgid "Default paper size"
 msgstr "Standaard papier-formaat"
 
@@ -105,7 +105,8 @@
 #: tlpkg/installer/install-menu-perltk.pl:630
 #: tlpkg/installer/install-menu-perltk.pl:676
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:544
-#: tlpkg/installer/install-tl-gui.tcl:1374
+#: tlpkg/installer/install-tl-gui.tcl:1040
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2102
 msgid "Quit"
 msgstr "Stoppen"
 
@@ -246,7 +247,7 @@
 #: tlpkg/installer/install-menu-wizard.pl:423
 #: tlpkg/installer/install-menu-wizard.pl:587
 msgid "Destination folder:"
-msgstr "Bestemmings-folder"
+msgstr "Bestemmings-folder:"
 
 #: tlpkg/installer/install-menu-wizard.pl:425
 #: tlpkg/installer/install-menu-perltk.pl:317
@@ -272,12 +273,12 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2433
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2438
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2443
-#: tlpkg/installer/install-tl-gui.tcl:739
-#: tlpkg/installer/install-tl-gui.tcl:1418
-#: tlpkg/installer/install-tl-gui.tcl:1428
-#: tlpkg/installer/install-tl-gui.tcl:1437
-#: tlpkg/installer/install-tl-gui.tcl:1472
-#: tlpkg/installer/install-tl-gui.tcl:1491
+#: tlpkg/installer/install-tl-gui.tcl:408
+#: tlpkg/installer/install-tl-gui.tcl:1084
+#: tlpkg/installer/install-tl-gui.tcl:1094
+#: tlpkg/installer/install-tl-gui.tcl:1103
+#: tlpkg/installer/install-tl-gui.tcl:1138
+#: tlpkg/installer/install-tl-gui.tcl:1157
 msgid "Change"
 msgstr "Wijzig"
 
@@ -292,7 +293,7 @@
 #: tlpkg/installer/install-menu-wizard.pl:469
 #: tlpkg/installer/install-menu-perltk.pl:1080
 msgid "disk space required:"
-msgstr "benodigde schijfruimte"
+msgstr "benodigde schijfruimte:"
 
 #: tlpkg/installer/install-menu-wizard.pl:489
 #: tlpkg/installer/install-menu-perltk.pl:1091
@@ -301,7 +302,7 @@
 
 #: tlpkg/installer/install-menu-wizard.pl:534
 msgid "This screen allows you to configure some options"
-msgstr "Met dit scherm kunt u enkele opties instellen."
+msgstr "Met dit scherm kunt u enkele opties instellen"
 
 #: tlpkg/installer/install-menu-wizard.pl:579
 #, perl-format
@@ -344,13 +345,13 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:700
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1109
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1730
-#: tlpkg/installer/install-tl-gui.tcl:59
 msgid "No"
 msgstr "Nee"
 
 #: tlpkg/installer/install-menu-wizard.pl:604
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:456
-#: tlpkg/installer/install-tl-gui.tcl:1372
+#: tlpkg/installer/install-tl-gui.tcl:1038
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1818
 msgid "Install"
 msgstr "Installeren"
 
@@ -357,19 +358,22 @@
 #: tlpkg/installer/install-menu-perltk.pl:48
 #: tlpkg/installer/install-menu-perltk.pl:1251
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:143
-#: tlpkg/installer/install-tl-gui.tcl:1604
+#: tlpkg/installer/install-tl-gui.tcl:600
+#: tlpkg/installer/install-tl-gui.tcl:1270
 msgid "None"
 msgstr "Geen"
 
 #: tlpkg/installer/install-menu-perltk.pl:49
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:144
-#: tlpkg/installer/install-tl-gui.tcl:1604
+#: tlpkg/installer/install-tl-gui.tcl:1270
 msgid "Only new"
 msgstr "Alleen nieuw"
 
 #: tlpkg/installer/install-menu-perltk.pl:50
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:145
-#: tlpkg/installer/install-tl-gui.tcl:1604
+#: tlpkg/installer/install-tl-gui.tcl:1270
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2020
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2031
 msgid "All"
 msgstr "Alle"
 
@@ -383,17 +387,17 @@
 msgstr "letter"
 
 #: tlpkg/installer/install-menu-perltk.pl:55
-#: tlpkg/installer/install-tl-gui.tcl:1592
+#: tlpkg/installer/install-tl-gui.tcl:1258
 msgid "No shortcuts"
 msgstr "Geen TeX Live menu"
 
 #: tlpkg/installer/install-menu-perltk.pl:56
-#: tlpkg/installer/install-tl-gui.tcl:1592
+#: tlpkg/installer/install-tl-gui.tcl:1258
 msgid "TeX Live menu"
 msgstr "TeX Live menu"
 
 #: tlpkg/installer/install-menu-perltk.pl:57
-#: tlpkg/installer/install-tl-gui.tcl:1592
+#: tlpkg/installer/install-tl-gui.tcl:1258
 msgid "Launcher entry"
 msgstr "Launcher item"
 
@@ -414,7 +418,7 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2270
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2332
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2669
-#: tlpkg/installer/install-tl-gui.tcl:668
+#: tlpkg/installer/install-tl-gui.tcl:335
 msgid "Warning"
 msgstr "Waarschuwing"
 
@@ -456,14 +460,14 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2466
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2504
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2669
-#: tlpkg/installer/install-tl-gui.tcl:528
-#: tlpkg/installer/install-tl-gui.tcl:647
-#: tlpkg/installer/install-tl-gui.tcl:755
-#: tlpkg/installer/install-tl-gui.tcl:839
-#: tlpkg/installer/install-tl-gui.tcl:1018
-#: tlpkg/installer/install-tl-gui.tcl:1056
-#: tlpkg/installer/install-tl-gui.tcl:1187
-#: tlpkg/installer/install-tl-gui.tcl:1328
+#: tlpkg/installer/install-tl-gui.tcl:314
+#: tlpkg/installer/install-tl-gui.tcl:424
+#: tlpkg/installer/install-tl-gui.tcl:508
+#: tlpkg/installer/install-tl-gui.tcl:692
+#: tlpkg/installer/install-tl-gui.tcl:728
+#: tlpkg/installer/install-tl-gui.tcl:857
+#: tlpkg/installer/install-tl-gui.tcl:996 tlpkg/TeXLive/tltcl.tcl:357
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1198
 msgid "Ok"
 msgstr "Ok"
 
@@ -529,7 +533,7 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1181
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1231
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1240
-#: tlpkg/installer/install-tl-gui.tcl:1445
+#: tlpkg/installer/install-tl-gui.tcl:1111
 msgid "Toggle"
 msgstr "Wijzig"
 
@@ -555,27 +559,28 @@
 
 #: tlpkg/installer/install-menu-perltk.pl:440
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:513
-#: tlpkg/installer/install-tl-gui.tcl:1527
+#: tlpkg/installer/install-tl-gui.tcl:1193
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1947
 msgid "Options"
 msgstr "Opties"
 
 #: tlpkg/installer/install-menu-perltk.pl:458
-#: tlpkg/installer/install-tl-gui.tcl:1547
+#: tlpkg/installer/install-tl-gui.tcl:1213
 msgid "Allow execution of restricted list of programs via \\write18"
 msgstr "Sta uitvoering van een beperkte lijst programmas toe via \\write18"
 
 #: tlpkg/installer/install-menu-perltk.pl:473
-#: tlpkg/installer/install-tl-gui.tcl:1554
+#: tlpkg/installer/install-tl-gui.tcl:1220
 msgid "Create all format files"
 msgstr "Genereer alle format bestanden"
 
 #: tlpkg/installer/install-menu-perltk.pl:485
-#: tlpkg/installer/install-tl-gui.tcl:1562
+#: tlpkg/installer/install-tl-gui.tcl:1228
 msgid "Install font/macro doc tree"
 msgstr "Installeer font/macro doc folder"
 
 #: tlpkg/installer/install-menu-perltk.pl:498
-#: tlpkg/installer/install-tl-gui.tcl:1572
+#: tlpkg/installer/install-tl-gui.tcl:1238
 msgid "Install font/macro source tree"
 msgstr "Installeer font/macro bron folder"
 
@@ -585,7 +590,7 @@
 msgstr "Maak symlinks naar standaard-folders"
 
 #: tlpkg/installer/install-menu-perltk.pl:585
-#: tlpkg/installer/install-tl-gui.tcl:1665
+#: tlpkg/installer/install-tl-gui.tcl:1331
 msgid "After install, set CTAN as source for package updates"
 msgstr "Kies na installatie CTAN als bron voor nieuwe versies van pakketten"
 
@@ -641,7 +646,7 @@
 
 #: tlpkg/installer/install-menu-perltk.pl:832
 msgid "custom selection of collections"
-msgstr "Eigen selektie van collekties"
+msgstr "eigen selektie van collekties"
 
 #: tlpkg/installer/install-menu-perltk.pl:869
 msgid "Select the collections to be installed"
@@ -656,9 +661,9 @@
 msgstr "Kies niets"
 
 #: tlpkg/installer/install-menu-perltk.pl:967
-#: tlpkg/installer/install-tl-gui.tcl:1645
+#: tlpkg/installer/install-tl-gui.tcl:1311
 msgid "create symlinks in standard directories"
-msgstr "Maak symlinks naar standaard-folders"
+msgstr "maak symlinks naar standaard-folders"
 
 #: tlpkg/installer/install-menu-perltk.pl:970
 msgid "binaries to"
@@ -739,7 +744,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:293
 msgid "Repository"
-msgstr "installatie-bron"
+msgstr "Installatie-bron"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:294
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2616
@@ -748,11 +753,11 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:294
 msgid "none"
-msgstr "Geen"
+msgstr "geen"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:297
 msgid "Load default"
-msgstr "Laad standaard installatie-bron."
+msgstr "Laad standaard installatie-bron"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:305
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:528
@@ -760,6 +765,7 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1283
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1705
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2612
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1030
 msgid "multiple repositories"
 msgstr "meerdere installatie-bronnen"
 
@@ -772,6 +778,7 @@
 msgstr "Laat instellingen zien"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:321
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2017
 msgid "Status"
 msgstr "Status"
 
@@ -806,7 +813,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:339
 msgid "schemes"
-msgstr "Schema's"
+msgstr "schema's"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:342
 msgid "Match"
@@ -833,12 +840,12 @@
 msgstr "niet gekozen"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:389
-#: tlpkg/installer/install-tl-gui.tcl:1172
+#: tlpkg/installer/install-tl-gui.tcl:842
 msgid "Select all"
 msgstr "Kies alles"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:391
-#: tlpkg/installer/install-tl-gui.tcl:1180
+#: tlpkg/installer/install-tl-gui.tcl:850
 msgid "Select none"
 msgstr "Kies niets"
 
@@ -871,11 +878,13 @@
 msgstr "Herinstalleer eerder verwijderde pakketten"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:451
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1823
 msgid "Update"
 msgstr "Werk bij"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:460
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2014
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1828
 msgid "Remove"
 msgstr "Verwijder"
 
@@ -884,11 +893,13 @@
 msgstr "Maak reserve-kopie"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:515
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1938
 msgid "Actions"
 msgstr "Akties"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:519
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2694
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1967
 msgid "Help"
 msgstr "Help"
 
@@ -898,7 +909,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:534
 msgid "Load cmd line repository:"
-msgstr "Laad cmd line installatie-bron."
+msgstr "Laad cmd line installatie-bron:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:537
 msgid "Load standard net repository:"
@@ -1011,7 +1022,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:696
 msgid "Long description:"
-msgstr "Lange beschrijving;"
+msgstr "Lange beschrijving:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:699
 msgid "Installed:"
@@ -1043,11 +1054,11 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:729
 msgid "Primary characterization:"
-msgstr "Primaire omschrijving"
+msgstr "Primaire omschrijving:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:734
 msgid "Secondary characterization:"
-msgstr "Secundaire omschrijving"
+msgstr "Secundaire omschrijving:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:745
 msgid "Collection:"
@@ -1103,7 +1114,7 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1128
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1137
 msgid "General options"
-msgstr "Algemene opties:"
+msgstr "Algemene opties"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1142
 msgid "Default package repository"
@@ -1148,10 +1159,10 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1227
 msgid "Create shortcuts on the desktop"
-msgstr "Maak snelkoppelingen op het bureaublad."
+msgstr "Maak snelkoppelingen op het bureaublad"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1236
-#: tlpkg/installer/install-tl-gui.tcl:1617
+#: tlpkg/installer/install-tl-gui.tcl:1283
 msgid "Install for all users"
 msgstr "Installeer voor alle gebruikers"
 
@@ -1158,7 +1169,7 @@
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1283
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1285
 msgid "Load default repository:"
-msgstr "Laad standaard installatie-bron."
+msgstr "Laad standaard installatie-bron:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1342
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1351
@@ -1190,7 +1201,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1419
 msgid "Default language for GUI:"
-msgstr "Standaard-taal voor de GUI"
+msgstr "Standaard-taal voor de GUI:"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1434
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1463
@@ -1199,7 +1210,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1508
 msgid "Choose directory"
-msgstr "Kies folder:"
+msgstr "Kies folder"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1574
 msgid "Edit default package repositories"
@@ -1210,6 +1221,7 @@
 msgstr "Kies de te gebruiken installatie-bronnen"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1593
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1177
 msgid "Delete"
 msgstr "Verwijder"
 
@@ -1255,7 +1267,7 @@
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1890
 msgid "Loading of remote database failed."
-msgstr "Laden van online database mislukt"
+msgstr "Laden van online database mislukt."
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:1891
 msgid "Error message:"
@@ -1329,7 +1341,10 @@
 msgstr "Herstel alle pakketten naar de laatste versie"
 
 #: texmf-dist/scripts/texlive/tlmgrgui.pl:2417
-#: tlpkg/installer/install-tl-gui.tcl:411
+#: tlpkg/installer/install-tl-gui.tcl:237
+#: texmf-dist/scripts/tlshell/tlshell.tcl:796
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1326
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1510
 msgid "Close"
 msgstr "Afsluiten"
 
@@ -1398,15 +1413,11 @@
 "%s is met een fout geeindigd.\n"
 "Raadpleeg het log venster voor details."
 
-#: tlpkg/installer/install-tl-gui.tcl:188
-msgid "Error"
-msgstr "Fout"
-
-#: tlpkg/installer/install-tl-gui.tcl:235 tlpkg/translations/shortdesc.pl:2519
+#: tlpkg/installer/install-tl-gui.tcl:126 tlpkg/translations/shortdesc.pl:2519
 msgid "Welcome to TeX Live!"
 msgstr "Welkom bij TeX Live!"
 
-#: tlpkg/installer/install-tl-gui.tcl:238 tlpkg/translations/shortdesc.pl:2522
+#: tlpkg/installer/install-tl-gui.tcl:129 tlpkg/translations/shortdesc.pl:2522
 #, tcl-format, perl-format
 msgid ""
 "See %s/index.html for links to documentation.\n"
@@ -1422,7 +1433,7 @@
 "overweeg ondersteuning door lid te worden van zo'n groep.\n"
 "De lijst van gebruikersgroepen staat op http://tug.org/usergroups.html."
 
-#: tlpkg/installer/install-tl-gui.tcl:242 tlpkg/translations/shortdesc.pl:2527
+#: tlpkg/installer/install-tl-gui.tcl:133 tlpkg/translations/shortdesc.pl:2527
 #, tcl-format, perl-format
 msgid ""
 "Add %s/texmf-dist/doc/man to MANPATH.\n"
@@ -1435,49 +1446,40 @@
 "En bovenal, voeg %s/bin/%s\n"
 "toe aan PATH voor huidige en toekomstige sessies."
 
-#: tlpkg/installer/install-tl-gui.tcl:254
+#: tlpkg/installer/install-tl-gui.tcl:145
 msgid "Error while reading from Perl backend"
 msgstr "Fout bij het lezen van het Perl achtergrond-proces"
 
-#: tlpkg/installer/install-tl-gui.tcl:266
+#: tlpkg/installer/install-tl-gui.tcl:157
 msgid "Unexpected closed backend"
 msgstr "Achtergrond-proces onverwacht beeindigd"
 
-#: tlpkg/installer/install-tl-gui.tcl:376
-#: tlpkg/installer/install-tl-gui.tcl:1846
+#: tlpkg/installer/install-tl-gui.tcl:202
+#: tlpkg/installer/install-tl-gui.tcl:1512
 msgid "TeX Live Installer"
 msgstr "TeX Live Installatie"
 
-#: tlpkg/installer/install-tl-gui.tcl:378
+#: tlpkg/installer/install-tl-gui.tcl:204
 msgid "Loading..."
 msgstr "Laden..."
 
-#: tlpkg/installer/install-tl-gui.tcl:495
-#: tlpkg/installer/install-tl-gui.tcl:736
-msgid "Browse..."
-msgstr "Bladeren..."
-
-#: tlpkg/installer/install-tl-gui.tcl:589
-msgid "Select or type"
-msgstr "Kies of type"
-
-#: tlpkg/installer/install-tl-gui.tcl:621
+#: tlpkg/installer/install-tl-gui.tcl:288
 msgid "Cannot be created or cannot be written to"
 msgstr "Kan niet worden aangemaakt of is niet schrijfbaar"
 
-#: tlpkg/installer/install-tl-gui.tcl:633
+#: tlpkg/installer/install-tl-gui.tcl:300
 msgid "Directory name..."
 msgstr "Folder-naam..."
 
-#: tlpkg/installer/install-tl-gui.tcl:640
+#: tlpkg/installer/install-tl-gui.tcl:307
 msgid "Change name (slashes not allowed)"
 msgstr "Wijzig naam (slashes niet toegestaan)"
 
-#: tlpkg/installer/install-tl-gui.tcl:649
+#: tlpkg/installer/install-tl-gui.tcl:316
 msgid "No slashes allowed"
 msgstr "Slashes niet toegestaan"
 
-#: tlpkg/installer/install-tl-gui.tcl:667
+#: tlpkg/installer/install-tl-gui.tcl:334
 msgid ""
 "TL release component highly recommended!\n"
 "Are you sure?"
@@ -1485,92 +1487,96 @@
 "TL jaar component sterk aanbevolen!\n"
 "Weet u het zeker?"
 
-#: tlpkg/installer/install-tl-gui.tcl:710
-#: tlpkg/installer/install-tl-gui.tcl:1402
-#: tlpkg/installer/install-tl-gui.tcl:1410
+#: tlpkg/installer/install-tl-gui.tcl:377
+#: tlpkg/installer/install-tl-gui.tcl:1068
+#: tlpkg/installer/install-tl-gui.tcl:1076
 msgid "Installation root"
 msgstr "Hoofd TeX-folder"
 
-#: tlpkg/installer/install-tl-gui.tcl:741
+#: tlpkg/installer/install-tl-gui.tcl:405 tlpkg/TeXLive/tltcl.tcl:324
+msgid "Browse..."
+msgstr "Bladeren..."
+
+#: tlpkg/installer/install-tl-gui.tcl:410
 msgid "Toggle year"
 msgstr "Jaar component aan/uit"
 
-#: tlpkg/installer/install-tl-gui.tcl:749
+#: tlpkg/installer/install-tl-gui.tcl:418
 msgid "Localized directory names will be replaced by their real names"
 msgstr "Aangepaste folder-namen worden vervangen door hun werkelijke namen"
 
-#: tlpkg/installer/install-tl-gui.tcl:826
+#: tlpkg/installer/install-tl-gui.tcl:495
 #, tcl-format
 msgid "'~' equals %s, e.g. %s"
-msgstr ""
+msgstr "'~' betekent %s, bijvoorbeeld %s"
 
-#: tlpkg/installer/install-tl-gui.tcl:952
+#: tlpkg/installer/install-tl-gui.tcl:626
 msgid "Cannot deselect own platform"
 msgstr "Eigen platform is altijd geselecteerd"
 
-#: tlpkg/installer/install-tl-gui.tcl:983
-#: tlpkg/installer/install-tl-gui.tcl:1317
+#: tlpkg/installer/install-tl-gui.tcl:657
+#: tlpkg/installer/install-tl-gui.tcl:985
 msgid "Binaries"
 msgstr "Binaries"
 
-#: tlpkg/installer/install-tl-gui.tcl:1035
+#: tlpkg/installer/install-tl-gui.tcl:707
 msgid "Schemes"
 msgstr "Schema's"
 
-#: tlpkg/installer/install-tl-gui.tcl:1120
+#: tlpkg/installer/install-tl-gui.tcl:790
 msgid "Collections"
 msgstr "Collecties"
 
-#: tlpkg/installer/install-tl-gui.tcl:1143
+#: tlpkg/installer/install-tl-gui.tcl:813
 msgid "Languages"
 msgstr "Talen"
 
-#: tlpkg/installer/install-tl-gui.tcl:1145
+#: tlpkg/installer/install-tl-gui.tcl:815
 msgid "Other collections"
 msgstr "Andere collecties"
 
-#: tlpkg/installer/install-tl-gui.tcl:1270
+#: tlpkg/installer/install-tl-gui.tcl:938
 msgid "Warning. Not all configured directories are writable!"
 msgstr "Waarschuwing. Niet alle geconfigureerde folders zijn schrijfbaar!"
 
-#: tlpkg/installer/install-tl-gui.tcl:1290
+#: tlpkg/installer/install-tl-gui.tcl:958
 msgid "Symlinks"
 msgstr "Symlinks"
 
-#: tlpkg/installer/install-tl-gui.tcl:1313
+#: tlpkg/installer/install-tl-gui.tcl:981
 msgid "browse..."
-msgstr "Bladeren..."
+msgstr "bladeren..."
 
-#: tlpkg/installer/install-tl-gui.tcl:1318
+#: tlpkg/installer/install-tl-gui.tcl:986
 msgid "Man pages"
 msgstr "Man pagina's"
 
-#: tlpkg/installer/install-tl-gui.tcl:1319
+#: tlpkg/installer/install-tl-gui.tcl:987
 msgid "Info pages"
 msgstr "Info pagina's"
 
-#: tlpkg/installer/install-tl-gui.tcl:1362
+#: tlpkg/installer/install-tl-gui.tcl:1028
 #, tcl-format
 msgid "TeX Live %s Installer"
 msgstr "TeX Live %s Installatie"
 
-#: tlpkg/installer/install-tl-gui.tcl:1378
+#: tlpkg/installer/install-tl-gui.tcl:1044
 msgid "Advanced"
 msgstr "Geavanceerd"
 
-#: tlpkg/installer/install-tl-gui.tcl:1405
+#: tlpkg/installer/install-tl-gui.tcl:1071
 msgid "Directories"
 msgstr "Folders"
 
-#: tlpkg/installer/install-tl-gui.tcl:1423
+#: tlpkg/installer/install-tl-gui.tcl:1089
 msgid "Local additions"
 msgstr "Lokale toevoegingen"
 
-#: tlpkg/installer/install-tl-gui.tcl:1432
+#: tlpkg/installer/install-tl-gui.tcl:1098
 msgid "Per-user additions"
 msgstr "Toevoegingen per gebruiker"
 
-#: tlpkg/installer/install-tl-gui.tcl:1442
+#: tlpkg/installer/install-tl-gui.tcl:1108
 msgid ""
 "Portable setup:\n"
 "May reset TEXMFLOCAL\n"
@@ -1580,50 +1586,455 @@
 "Kan TEXMFLOCAL en\n"
 "TEXMFHOME terugzetten"
 
-#: tlpkg/installer/install-tl-gui.tcl:1456
+#: tlpkg/installer/install-tl-gui.tcl:1122
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1289
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1964
 msgid "Platforms"
 msgstr "Platforms"
 
-#: tlpkg/installer/install-tl-gui.tcl:1469
+#: tlpkg/installer/install-tl-gui.tcl:1135
 msgid "N. of additional platform(s):"
 msgstr "Aantal extra platforms:"
 
-#: tlpkg/installer/install-tl-gui.tcl:1482
+#: tlpkg/installer/install-tl-gui.tcl:1148
 msgid "Selections"
 msgstr "Selekties"
 
-#: tlpkg/installer/install-tl-gui.tcl:1487
+#: tlpkg/installer/install-tl-gui.tcl:1153
 msgid "Scheme:"
 msgstr "Schema:"
 
-#: tlpkg/installer/install-tl-gui.tcl:1496
+#: tlpkg/installer/install-tl-gui.tcl:1162
 msgid "N. of collections:"
 msgstr "Aantal collecties:"
 
-#: tlpkg/installer/install-tl-gui.tcl:1499
+#: tlpkg/installer/install-tl-gui.tcl:1165
 msgid "Customize"
 msgstr "Aanpassen"
 
-#: tlpkg/installer/install-tl-gui.tcl:1508
+#: tlpkg/installer/install-tl-gui.tcl:1174
 msgid "Disk space required (in MB):"
 msgstr "Vereiste schijfruimte (in MB):"
 
-#: tlpkg/installer/install-tl-gui.tcl:1585
+#: tlpkg/installer/install-tl-gui.tcl:1251
 msgid "Adjust searchpath"
 msgstr "Zoekpad aanpassen"
 
-#: tlpkg/installer/install-tl-gui.tcl:1594
+#: tlpkg/installer/install-tl-gui.tcl:1260
 msgid "Desktop integration"
 msgstr "Bureaublad-integratie"
 
-#: tlpkg/installer/install-tl-gui.tcl:1606
+#: tlpkg/installer/install-tl-gui.tcl:1272
 msgid "File associations"
 msgstr "Koppeling bestandsformaten"
 
-#: tlpkg/installer/install-tl-gui.tcl:1651
+#: tlpkg/installer/install-tl-gui.tcl:1317
 msgid "Specify directories"
 msgstr "Specificeer folders"
 
+#: tlpkg/TeXLive/tltcl.tcl:403
+msgid "Select or type"
+msgstr "Kies of type"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:131
+msgid "ok"
+msgstr "ok"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:135
+msgid "yes"
+msgstr "ja"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:137
+msgid "no"
+msgstr "nee"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:141
+msgid "cancel"
+msgstr "afbreken"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:202
+msgid "IDLE"
+msgstr "INACTIEF"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:205
+#: texmf-dist/scripts/tlshell/tlshell.tcl:281
+msgid "BUSY"
+msgstr "BEZIG"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:397
+#: texmf-dist/scripts/tlshell/tlshell.tcl:433
+msgid "Running"
+msgstr "Bezig"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:417
+msgid "Idle"
+msgstr "Inactief"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:528
+msgid "Needs updating"
+msgstr "Moet worden bijgewerkt"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:530
+msgid "Up to date"
+msgstr "Up to date"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:532
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1993
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:676
+msgid "A configured repository is unavailable."
+msgstr "Een ingestelde installatie-bron is niet beschikbaar."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:786
+msgid "Output"
+msgstr "Uitvoer"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:787
+msgid "Errors"
+msgstr "Fouten"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:921
+#, tcl-format
+msgid "%s not a repository"
+msgstr "%s is geen installatie-bron"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1061
+msgid "Main Repository"
+msgstr "Primaire installatie-bron"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1072
+msgid "Current:"
+msgstr "Huidig:"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1078
+msgid "New"
+msgstr "Nieuw"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1086
+msgid "Any CTAN mirror"
+msgstr "Willekeurige CTAN mirror"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1096
+msgid "Specific mirror..."
+msgstr "Specifieke CTAN mirror..."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1116
+msgid "Local directory..."
+msgstr "Lokale folder..."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1122
+msgid "Save and Load"
+msgstr "Opslaan en laden"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1128
+msgid "Abort"
+msgstr "Afbreken"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1138
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1143
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1953
+msgid "Additional repositories"
+msgstr "Externe installatie-bronnen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1148
+msgid "Add tlcontrib"
+msgstr "Voeg tlcontrib toe"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1150
+msgid "Packages which cannot be part of TeX Live"
+msgstr "Pakketten die geen onderdeel kunnen uitmaken van TeX Live"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1158
+msgid "Tag (optional)"
+msgstr "Kenteken (indien gewenst)"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1179
+msgid "Add"
+msgstr "Toevoegen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1220
+#, tcl-format
+msgid "Cannot remove own platform %s"
+msgstr "Eigen platform %s is altijd geselecteerd"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1305
+msgid "platform"
+msgstr "platform"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1323
+msgid "Apply and close"
+msgstr "Toepassen en sluiten"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1379
+#, tcl-format
+msgid "Restore %s to revision %s?"
+msgstr "%s terugdraaien naar %s?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1402
+msgid "No backups configured"
+msgstr "Geen reserve-kopieën geconfigureerd"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1412
+msgid "No backup directory defined"
+msgstr "Geen folder voor reserve-kopieën gedefinieerd"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1417
+#, tcl-format
+msgid "Backup directory %s does not exist"
+msgstr "Folder %s voor reserve-kopieën bestaat niet"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1440
+#, tcl-format
+msgid "No packages in backup directory %s"
+msgstr "Geen pakketten in folder %s voor reserve-kopieën"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1450
+msgid "Restore from backup"
+msgstr "Herinstalleer vanaf reserve-kopie"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1466
+msgid "Package"
+msgstr "Pakket"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1467
+msgid "Revision"
+msgstr "Revisie"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1508
+msgid "Restore all"
+msgstr "Herstel alle"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1526
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1541
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1580
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1627
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1701
+msgid "Nothing to do!"
+msgstr "Niets te doen!"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1538
+msgid "Update self first!"
+msgstr "Eerst zelf bijwerken!"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1600
+#, tcl-format
+msgid "Already installed: %s"
+msgstr "Al geïnstalleerd: %s"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1640
+#, tcl-format
+msgid ""
+"Also updating dependencies\n"
+"\n"
+"%s?"
+msgstr ""
+"Ook afhankelijkheden\n"
+"%s\n"
+"bijwerken?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1655
+#, tcl-format
+msgid "Updating hard dependencies %s anyway. Continue?"
+msgstr "Harde afhankelijkheden %s worden in elk geval bijgewerkt. Doorgaan?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1667
+#, tcl-format
+msgid "Skipped because not installed: %s"
+msgstr ""
+"Niet gïnstalleerd: %s\n"
+"overgeslagen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1670
+#, tcl-format
+msgid "Skipped because already up to date: %s"
+msgstr "Overgeslagen: %s; al up to date"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1705
+#, tcl-format
+msgid ""
+"Also remove dependencies\n"
+"\n"
+"%s?"
+msgstr ""
+"Verwijder ook afhankelijkheden\n"
+"%s?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1720
+#, tcl-format
+msgid "Removing hard dependencies %s anyway. Continue?"
+msgstr "Harde afhankelijkheden %s worden in elk geval verwijderd. Doorgaan?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1814
+msgid "Info"
+msgstr "Info"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1885
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1907
+msgid "File"
+msgstr "Archief"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1909
+msgid "Load default repository"
+msgstr "Laad standaard installatie-bron"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1911
+msgid "Exit"
+msgstr "Einde"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1915
+msgid "Packages"
+msgstr "Pakketten"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1919
+msgid "Update tlmgr"
+msgstr "Werk tlmgr bij"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1922
+msgid "Update all"
+msgstr "Alles bijwerken"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1924
+msgid "Install marked"
+msgstr "Installeer selektie"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1927
+msgid "Update marked"
+msgstr "Werk selektie bij"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1930
+msgid "Remove marked"
+msgstr "Verwijder selektie"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1934
+msgid "Restore from backup..."
+msgstr "Herinstalleer vanaf reserve-kopie..."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1940
+msgid "Regenerate filename database"
+msgstr "Ververs database van bestandsnamen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1941
+msgid "Regenerating filename database..."
+msgstr "Bezig met verversen database..."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1942
+msgid "Regenerate formats"
+msgstr "Ververs formaten"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1943
+msgid "Rebuilding formats..."
+msgstr "Bezig formaten te verversen..."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1944
+msgid "Regenerate fontmaps"
+msgstr "Ververs fontmaps"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1945
+msgid "Rebuilding fontmap files..."
+msgstr "Bezig fontmaps te verversen.."
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1950
+msgid "Change main repository"
+msgstr "Wijzig primaire installatie-bron"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1956
+msgid "Paper"
+msgstr "Papier"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1984
+msgid "Default repositories"
+msgstr "Ingestelde installatie-bronnen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1988
+msgid "Not loaded"
+msgstr "Niet geladen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1991
+msgid "TL Manager up to date?"
+msgstr "TL Manager up to date?"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:1996
+msgid "Last tlmgr command:"
+msgstr "Laatste tlmgr opdracht:"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2003
+msgid "Type command:"
+msgstr "Typ opdracht:"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2005
+msgid "Go"
+msgstr "Uitvoeren"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2011
+msgid "Package list"
+msgstr "Lijst van pakketten"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2018
+msgid "Installed"
+msgstr "Geïnstalleerd"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2022
+msgid "Updatable"
+msgstr "Nieuwe versie"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2030
+msgid "Detail >> Global"
+msgstr "Detail >> Globaal"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2033
+msgid "Collections and schemes"
+msgstr "Collecties en schemas"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2035
+msgid "Only schemes"
+msgstr "Alleen schemas"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2043
+msgid "Mark all"
+msgstr "Kies alles"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2045
+msgid "Mark none"
+msgstr "Kies niets"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2053
+msgid "Search package names"
+msgstr "Zoek op naam pakket"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2056
+msgid "Also search short descriptions"
+msgstr "Zoek ook in korte beschrijvingen"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2067
+msgid "Name"
+msgstr "Naam"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2068
+msgid "Local Rev. (ver.)"
+msgstr "Lokale rev. (ver.)"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2069
+msgid "Remote Rev. (ver.)"
+msgstr "Online rev. (ver.)"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2070
+msgid "Description"
+msgstr "Beschrijving"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2104
+msgid "Restart self"
+msgstr "Herstart zelf"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2106
+msgid "Restart tlmgr"
+msgstr "Herstart tlmgr"
+
+#: texmf-dist/scripts/tlshell/tlshell.tcl:2109
+msgid "Show logs"
+msgstr "Toon logs"
+
 #: tlpkg/translations/shortdesc.pl:1
 msgid "basic scheme (plain and latex)"
 msgstr "basis-schema (Plain en latex)"
@@ -1634,7 +2045,7 @@
 
 #: tlpkg/translations/shortdesc.pl:3
 msgid "full scheme (everything)"
-msgstr "Volledig schema (alles)"
+msgstr "volledig schema (alles)"
 
 #: tlpkg/translations/shortdesc.pl:4
 msgid "GUST TeX Live scheme"
@@ -1642,11 +2053,11 @@
 
 #: tlpkg/translations/shortdesc.pl:5
 msgid "infrastructure-only scheme (no TeX at all)"
-msgstr "Alleen infrastruktuur (helemaal geen TeX)"
+msgstr "alleen infrastruktuur (helemaal geen TeX)"
 
 #: tlpkg/translations/shortdesc.pl:6
 msgid "medium scheme (small + more packages and languages)"
-msgstr "Medium schema (klein + meer pakketten en taken)"
+msgstr "medium schema (klein + meer pakketten en taken)"
 
 #: tlpkg/translations/shortdesc.pl:7
 msgid "minimal scheme (plain only)"
@@ -1824,6 +2235,33 @@
 msgid "XeTeX and packages"
 msgstr "XeTeX en bijbehorende pakketten"
 
+#~ msgid "Multiple repositories:"
+#~ msgstr "Meerdere installatie-bronnen:"
+
+#~ msgid "Additional Repositories"
+#~ msgstr "Extra installatie-bronnen"
+
+#~ msgid "Third-party repositories"
+#~ msgstr "Externe installatie-bronnen"
+
+#~ msgid "Change main repository..."
+#~ msgstr "Wijzig primaire installatie-bron"
+
+#~ msgid "Platforms..."
+#~ msgstr "Platforms ..."
+
+#~ msgid "Error"
+#~ msgstr "Fout"
+
+#~ msgid "Repositories"
+#~ msgstr "Installatie-bronnen"
+
+#~ msgid "Change repository..."
+#~ msgstr "Verander standaard installatie-bron..."
+
+#~ msgid "Default repository"
+#~ msgstr "Standaard installatie-bron"
+
 #~ msgid "'~' equals %s, e.g.%s"
 #~ msgstr "'~' betekent %s, bijvoorbeeld %s"
 
@@ -2458,9 +2896,6 @@
 #~ msgid "Updating packages"
 #~ msgstr "Pakketten bijwerken"
 
-#~ msgid "Update all"
-#~ msgstr "Alles bijwerken"
-
 #~ msgid "Update selected"
 #~ msgstr "Keuzen bijwerken"
 
@@ -2537,9 +2972,6 @@
 #~ msgid "Update LuaTeX font database"
 #~ msgstr "Werk LuaTeX font database bij"
 
-#~ msgid "File"
-#~ msgstr "Archief"
-
 #, fuzzy
 #~ msgid "%s collections out of %s (disk space required: %s MB)"
 #~ msgstr "%s collecties van %s (disk space required: %s MB)"



More information about the tex-live-commits mailing list