1#!/bin/sh
2#-
3# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4#
5# Copyright (c) 2010 iXsystems, Inc.  All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28# $FreeBSD$
29
30# Functions which runs commands on the system
31
32. ${BACKEND}/functions.sh
33. ${BACKEND}/functions-parse.sh
34
35
36# Function which localizes a FreeBSD install
37localize_freebsd()
38{
39  sed -i.bak "s/lang=en_US/lang=${LOCALE}/g" ${FSMNT}/etc/login.conf
40  rm ${FSMNT}/etc/login.conf.bak
41};
42
43localize_x_desktops() {
44
45  # Check for and customize KDE lang
46  ##########################################################################
47
48  # Check if we can localize KDE via skel
49  if [ -e "${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals" ] ; then
50    sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
51    sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
52    sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
53  fi
54
55  # Check if we have a KDE root config
56  if [ -e "${FSMNT}/root/.kde4/share/config/kdeglobals" ] ; then
57    sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
58  fi
59
60  # Check for KDM
61  if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc" ] ; then
62    sed -i '' "s/Language=en_US/Language=${LOCALE}.UTF-8/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
63  fi
64
65  # Check for and customize GNOME / GDM lang
66  ##########################################################################
67
68  # See if GDM is enabled and customize its lang
69  cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep -q "gdm_enable=\"YES\"" 2>/dev/null
70  if [ "$?" = "0" ] ; then
71    echo "gdm_lang=\"${LOCALE}.UTF-8\"" >> ${FSMNT}/etc/rc.conf
72  fi
73
74};
75
76# Function which localizes a PC-BSD install
77localize_pcbsd()
78{
79  # Check if we have a localized splash screen and copy it
80  if [ -e "${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx" ]
81  then
82    cp ${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx ${FSMNT}/boot/loading-screen.pcx    
83  fi
84
85};
86
87localize_x_keyboard()
88{
89  KEYMOD="$1"
90  KEYLAY="$2"
91  KEYVAR="$3"
92  COUNTRY="$4"
93  OPTION="grp:alt_shift_toggle"
94  SETXKBMAP=""
95
96  if [ "${COUNTRY}" = "NONE" -o "${COUNTRY}" = "us" -o "${COUNTRY}" = "C" ] ; then
97    #In this case we don't need any additional language
98    COUNTRY=""
99    OPTION=""
100  else
101    COUNTRY=",${COUNTRY}"
102  fi
103
104  if [ "${KEYMOD}" != "NONE" ]
105  then
106    SETXKBMAP="-model ${KEYMOD}"
107    KXMODEL="${KEYMOD}"
108  else
109    KXMODEL="pc104"
110  fi
111
112  if [ "${KEYLAY}" != "NONE" ]
113  then
114    localize_key_layout "$KEYLAY"
115    SETXKBMAP="${SETXKBMAP} -layout ${KEYLAY}"
116    KXLAYOUT="${KEYLAY}"
117  else
118    KXLAYOUT="us"
119  fi
120
121  if [ "${KEYVAR}" != "NONE" ]
122  then
123    SETXKBMAP="${SETXKBMAP} -variant ${KEYVAR}"
124    KXVAR="(${KEYVAR})"
125  else
126    KXVAR=""
127  fi
128
129  # Setup .xprofile with our setxkbmap call now
130  if [ ! -z "${SETXKBMAP}" ]
131  then
132    if [ ! -e "${FSMNT}/usr/share/skel/.xprofile" ]
133    then
134      echo "#!/bin/sh" >${FSMNT}/usr/share/skel/.xprofile
135    fi
136
137    # Save the keyboard layout for user / root X logins
138    echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/share/skel/.xprofile
139    chmod 755 ${FSMNT}/usr/share/skel/.xprofile
140    cp ${FSMNT}/usr/share/skel/.xprofile ${FSMNT}/root/.xprofile
141
142    # Save it for KDM
143    if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup" ] ; then
144      echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup
145    fi
146  fi
147 
148  # Create the kxkbrc configuration using these options
149  if [ -d "${FSMNT}/usr/share/skel/.kde4/share/config" ] ; then
150    echo "[Layout]
151DisplayNames=${KXLAYOUT}${COUNTRY}
152IndicatorOnly=false
153LayoutList=${KXLAYOUT}${KXVAR}${COUNTRY}
154Model=${KXMODEL}
155Options=${OPTION}
156ResetOldOptions=true
157ShowFlag=true
158ShowSingle=false
159SwitchMode=WinClass
160Use=true " >${FSMNT}/usr/share/skel/.kde4/share/config/kxkbrc
161  fi
162
163};
164
165localize_key_layout()
166{
167
168  KEYLAYOUT="$1"
169
170  # Set the keylayout in rc.conf
171  case ${KEYLAYOUT} in
172    am) KEYLAYOUT_CONSOLE="hy.armscii-8" ;;
173    ca) KEYLAYOUT_CONSOLE="fr_CA.acc.iso" ;;
174    ch) KEYLAYOUT_CONSOLE="swissgerman.iso" ;;
175    cz) KEYLAYOUT_CONSOLE="cz.iso2" ;;
176    de) KEYLAYOUT_CONSOLE="german.iso" ;;
177    dk) KEYLAYOUT_CONSOLE="danish.iso" ;;
178    ee) KEYLAYOUT_CONSOLE="estonian.iso" ;;
179    es) KEYLAYOUT_CONSOLE="spanish.iso" ;;
180    fi) KEYLAYOUT_CONSOLE="finnish.iso" ;;
181    is) KEYLAYOUT_CONSOLE="icelandic.iso" ;;
182    jp) KEYLAYOUT_CONSOLE="jp.106" ;;
183    nl) KEYLAYOUT_CONSOLE="dutch.iso.acc" ;;
184    no) KEYLAYOUT_CONSOLE="norwegian.iso" ;;
185    pl) KEYLAYOUT_CONSOLE="pl_PL.ISO8859-2" ;;
186    ru) KEYLAYOUT_CONSOLE="ru.koi8-r" ;;
187    sk) KEYLAYOUT_CONSOLE="sk.iso2" ;;
188    se) KEYLAYOUT_CONSOLE="swedish.iso" ;;
189    tr) KEYLAYOUT_CONSOLE="tr.iso9.q" ;;
190    gb) KEYLAYOUT_CONSOLE="uk.iso" ;;
191     *)  if [ ! -z "${KEYLAYOUT}" ]
192         then
193           KEYLAYOUT_CONSOLE="${KEYLAYOUT}.iso"
194         fi
195        ;;
196  esac
197
198  if [ -n "${KEYLAYOUT_CONSOLE}" ]
199  then
200    echo "keymap=\"${KEYLAYOUT_CONSOLE}\"" >>${FSMNT}/etc/rc.conf
201  fi
202
203};
204
205#  Function which prunes other l10n files from the KDE install
206localize_prune_langs()
207{
208  get_value_from_cfg localizeLang
209  KEEPLANG="$VAL"
210  if [ -z "$KEEPLANG" ] ; then
211    KEEPLANG="en"
212  fi
213  export KEEPLANG 
214
215  echo_log "Pruning other l10n files, keeping ${KEEPLANG}"
216
217  # Create the script to do uninstalls
218  echo '#!/bin/sh
219
220  for i in `pkg_info -xEI kde-l10n`
221  do
222    echo "$i" | grep "${KEEPLANG}-kde"
223    if [ $? -ne 0 ] ; then
224      pkg_delete ${i}
225    fi
226  done
227  ' > ${FSMNT}/.pruneLangs.sh
228
229  chmod 755 ${FSMNT}/.pruneLangs.sh
230  chroot ${FSMNT} /.pruneLangs.sh >/dev/null 2>/dev/null
231  rm ${FSMNT}/.pruneLangs.sh
232
233};
234
235# Function which sets COUNTRY SETLANG and LOCALE based upon $1
236localize_get_codes()
237{ 
238  TARGETLANG="${1}"
239  # Setup the presets for the specific lang
240  case $TARGETLANG in
241    af)
242      COUNTRY="C"
243      SETLANG="af"
244      LOCALE="af_ZA"
245      ;;
246    ar)
247	  COUNTRY="C"
248      SETLANG="ar"
249      LOCALE="en_US"
250      ;;
251    az)
252	  COUNTRY="C"
253      SETLANG="az"
254      LOCALE="en_US"
255      ;;
256    ca)
257	  COUNTRY="es"
258      SETLANG="es:ca"
259      LOCALE="ca_ES"
260      ;;
261    be)
262	  COUNTRY="be"
263      SETLANG="be"
264      LOCALE="be_BY"
265      ;;
266    bn)
267	  COUNTRY="bn"
268      SETLANG="bn"
269      LOCALE="en_US"
270      ;;
271    bg)
272	  COUNTRY="bg"
273      SETLANG="bg"
274      LOCALE="bg_BG"
275      ;;
276    cs)
277	  COUNTRY="cz"
278      SETLANG="cs"
279      LOCALE="cs_CZ"
280      ;;
281    da)
282	  COUNTRY="dk"
283      SETLANG="da"
284      LOCALE="da_DK"
285      ;;
286    de)
287	  COUNTRY="de"
288      SETLANG="de"
289      LOCALE="de_DE"
290      ;;
291    en_GB)
292	  COUNTRY="gb"
293      SETLANG="en_GB:cy"
294      LOCALE="en_GB"
295      ;;
296    el)
297	  COUNTRY="gr"
298      SETLANG="el:gr"
299      LOCALE="el_GR"
300      ;;
301    es)
302	  COUNTRY="es"
303      SETLANG="es"
304      LOCALE="es_ES"
305      ;;
306    es_LA)
307	  COUNTRY="us"
308      SETLANG="es:en_US"
309      LOCALE="es_ES"
310      ;;
311    et)
312	  COUNTRY="ee"
313      SETLANG="et"
314      LOCALE="et_EE"
315      ;;
316    fr)
317	  COUNTRY="fr"
318      SETLANG="fr"
319      LOCALE="fr_FR"
320      ;;
321    he)
322	  COUNTRY="il"
323      SETLANG="he:ar"
324      LOCALE="he_IL"
325      ;;
326    hr)
327	  COUNTRY="hr"
328      SETLANG="hr"
329      LOCALE="hr_HR"
330      ;;
331    hu)
332	  COUNTRY="hu"
333      SETLANG="hu"
334      LOCALE="hu_HU"
335      ;;
336    it)
337	  COUNTRY="it"
338      SETLANG="it"
339      LOCALE="it_IT"
340      ;;
341    ja)
342	  COUNTRY="jp"
343      SETLANG="ja"
344      LOCALE="ja_JP"
345      ;;
346    ko)
347	  COUNTRY="kr"
348      SETLANG="ko"
349      LOCALE="ko_KR"
350      ;;
351    nl)
352	  COUNTRY="nl"
353      SETLANG="nl"
354      LOCALE="nl_NL"
355      ;;
356    nn)
357	  COUNTRY="no"
358      SETLANG="nn"
359      LOCALE="en_US"
360      ;;
361    pa)
362	  COUNTRY="pa"
363      SETLANG="pa"
364      LOCALE="en_US"
365      ;;
366    pl)
367	  COUNTRY="pl"
368      SETLANG="pl"
369      LOCALE="pl_PL"
370      ;;
371    pt)
372	  COUNTRY="pt"
373      SETLANG="pt"
374      LOCALE="pt_PT"
375      ;;
376    pt_BR)
377	  COUNTRY="br"
378      SETLANG="pt_BR"
379      LOCALE="pt_BR"
380      ;;
381    ru)
382	  COUNTRY="ru"
383      SETLANG="ru"
384      LOCALE="ru_RU"
385      ;;
386    sl)
387	  COUNTRY="si"
388      SETLANG="sl"
389      LOCALE="sl_SI"
390      ;;
391    sk)
392	  COUNTRY="sk"
393      SETLANG="sk"
394      LOCALE="sk_SK"
395      ;;
396    sv)
397	  COUNTRY="se"
398      SETLANG="sv"
399      LOCALE="sv_SE"
400      ;;
401    uk)
402	  COUNTRY="ua"
403      SETLANG="uk"
404      LOCALE="uk_UA"
405      ;;
406    vi)
407	  COUNTRY="vn"
408      SETLANG="vi"
409      LOCALE="en_US"
410      ;;
411    zh_CN)
412	  COUNTRY="cn"
413      SETLANG="zh_CN"
414      LOCALE="zh_CN"
415      ;;
416    zh_TW)
417	  COUNTRY="tw"
418      SETLANG="zh_TW"
419      LOCALE="zh_TW"
420      ;;
421    *)
422	  COUNTRY="C"
423      SETLANG="${TARGETLANG}"
424      LOCALE="en_US"
425      ;;
426  esac
427
428  export COUNTRY SETLANG LOCALE
429
430};
431
432# Function which sets the timezone on the system
433set_timezone()
434{
435  TZONE="$1"
436  cp ${FSMNT}/usr/share/zoneinfo/${TZONE} ${FSMNT}/etc/localtime
437};
438
439# Function which enables / disables NTP
440set_ntp()
441{
442  ENABLED="$1"
443  if [ "$ENABLED" = "yes" -o "${ENABLED}" = "YES" ]
444  then
445    cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep -q 'ntpd_enable="YES"' 2>/dev/null
446    if [ $? -ne 0 ]
447    then
448      echo 'ntpd_enable="YES"' >>${FSMNT}/etc/rc.conf
449      echo 'ntpd_sync_on_start="YES"' >>${FSMNT}/etc/rc.conf
450    fi
451  else
452    cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep -q 'ntpd_enable="YES"' 2>/dev/null
453    if [ $? -ne 0 ]
454    then
455      sed -i.bak 's|ntpd_enable="YES"||g' ${FSMNT}/etc/rc.conf
456    fi
457  fi
458};
459
460# Starts checking for localization directives
461run_localize()
462{
463  KEYLAYOUT="NONE"
464  KEYMOD="NONE"
465  KEYVAR="NONE"
466
467  while read line
468  do
469    # Check if we need to do any localization
470    echo $line | grep -q "^localizeLang=" 2>/dev/null
471    if [ $? -eq 0 ]
472    then
473
474      # Set our country / lang / locale variables
475      get_value_from_string "$line"
476      localize_get_codes ${VAL}
477
478      get_value_from_string "$line"
479      # If we are doing PC-BSD install, localize it as well as FreeBSD base
480      if [ "${INSTALLTYPE}" != "FreeBSD" ]
481      then
482        localize_pcbsd "$VAL"
483      fi
484
485      # Localize FreeBSD
486      localize_freebsd "$VAL"
487
488      # Localize any X pkgs
489      localize_x_desktops "$VAL"
490    fi
491
492    # Check if we need to do any keylayouts
493    echo $line | grep -q "^localizeKeyLayout=" 2>/dev/null
494    if [ $? -eq 0 ] ; then
495      get_value_from_string "$line"
496      KEYLAYOUT="$VAL"
497    fi
498
499    # Check if we need to do any key models
500    echo $line | grep -q "^localizeKeyModel=" 2>/dev/null
501    if [ $? -eq 0 ] ; then
502      get_value_from_string "$line"
503      KEYMOD="$VAL"
504    fi
505
506    # Check if we need to do any key variant
507    echo $line | grep -q "^localizeKeyVariant=" 2>/dev/null
508    if [ $? -eq 0 ] ; then
509      get_value_from_string "$line"
510      KEYVAR="$VAL"
511    fi
512
513
514    # Check if we need to set a timezone
515    echo $line | grep -q "^timeZone=" 2>/dev/null
516    if [ $? -eq 0 ] ; then
517      get_value_from_string "$line"
518      set_timezone "$VAL"
519    fi
520
521    # Check if we need to set a timezone
522    echo $line | grep -q "^enableNTP=" 2>/dev/null
523    if [ $? -eq 0 ] ; then
524      get_value_from_string "$line"
525      set_ntp "$VAL"
526    fi
527  done <${CFGF}
528
529  if [ "${INSTALLTYPE}" != "FreeBSD" ] ; then
530    # Do our X keyboard localization
531    localize_x_keyboard "${KEYMOD}" "${KEYLAYOUT}" "${KEYVAR}" "${COUNTRY}"
532  fi
533
534  # Check if we want to prunt any other KDE lang files to save some disk space
535  get_value_from_cfg localizePrune
536  if [ "${VAL}" = "yes" -o "${VAL}" = "YES" ] ; then
537    localize_prune_langs
538  fi
539
540  # Update the login.conf db, even if we didn't localize, its a good idea to make sure its up2date
541  run_chroot_cmd "/usr/bin/cap_mkdb /etc/login.conf" >/dev/null 2>/dev/null
542
543};
544