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