diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index a498694d2..000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,29 +0,0 @@
-#### Submission type
-
- - [ ] Bug report
- - [ ] Feature Request
-
-
-#### Info regarding which version of Calamares is used, which Distribution
-
-> …
-
-#### Provide information on how the disks are set up, in detail, with full logs of commands issued
-
-> …
-
-#### What do you expect to have happen when Calamares installs?
-
-> …
-
-#### Describe the issue you encountered
-
-> …
-
-#### Steps to reproduce the problem
-
-> …
-
-#### Include the installation.log (usually ~/Calamares/Calamares/Calamares.log, of the user Calamares runs as):
-
-> …
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..9a2204613
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,26 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+> Hi! Thank you for helping improve Calamares. If you are seeing a problem in installing a specific distribution, you should **probably** report the problem in the distribution's bug tracker, first. That helps filter out issues with packaging, mis-configuration, etc. that Calamares has no control over. If you are a distribution packager or maintainer, this page is for you.
+
+**Describe the bug**
+A clear and concise description of what the bug is. Please include 32/64 bit machine details, EFI/BIOS details, and disk setup.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots and Logs**
+If applicable, add screenshots to help explain your problem. Calamares has an installation log (usually `~/.cache/calamares/session.log`), please check it for confidential information and attach it if possible.
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..066b2d920
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,17 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32cd8ab3c..fa6f38c91 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -82,11 +82,11 @@ set( CALAMARES_VERSION_RC 0 )
# checks for new languages and misspelled ones are done (that is,
# copy these four lines to four backup lines, add "p", and then update
# the original four lines with the current translations).
-set( _tx_complete da pt_PT ro tr_TR zh_TW zh_CN pt_BR fr hr ca lt id cs_CZ )
-set( _tx_good sq es pl ja sk it_IT hu ru he de nl bg uk )
-set( _tx_ok ast is ar sv el es_MX gl en_GB th fi_FI hi eu sr nb
- sl sr@latin mr es_PR kk kn et be )
-set( _tx_bad uz lo ur gu fr_CH fa eo ko )
+set( _tx_complete ca zh_TW hr cs_CZ da et fr id it_IT lt pl pt_PT es_MX tr_TR )
+set( _tx_good sq de pt_BR zh_CN ja ro es sk )
+set( _tx_ok hu ru he nl bg uk ast is ko ar sv el gl en_GB
+ th fi_FI hi eu nb sr sl sr@latin mr es_PR kn kk be )
+set( _tx_bad fr_CH gu lo fa ur uz eo )
### Required versions
diff --git a/calamares.desktop b/calamares.desktop
index c1c8d44e2..42373404d 100644
--- a/calamares.desktop
+++ b/calamares.desktop
@@ -63,6 +63,7 @@ Comment[he]=קלמארס - אשף התקנה
Icon[hi]=calamares
GenericName[hi]=सिस्टम इंस्टॉलर
Comment[hi]=Calamares — सिस्टम इंस्टॉलर
+Name[hi]=सिस्टम इंस्टॉल करें
Icon[hr]=calamares
GenericName[hr]=Instalacija sustava
Comment[hr]=Calamares — Instalacija sustava
@@ -87,6 +88,10 @@ Icon[ja]=calamares
GenericName[ja]=システムインストーラー
Comment[ja]=Calamares — システムインストーラー
Name[ja]=システムをインストール
+Icon[ko]=깔라마레스
+GenericName[ko]=시스템 설치 관리자
+Comment[ko]=깔라마레스 — 시스템 설치 관리자
+Name[ko]=시스템 설치
Icon[lt]=calamares
GenericName[lt]=Sistemos diegimas į kompiuterį
Comment[lt]=Calamares — Sistemos diegimo programa
diff --git a/lang/calamares_en.ts b/lang/calamares_en.ts
index 8bd9c5bda..54a23b4e7 100644
--- a/lang/calamares_en.ts
+++ b/lang/calamares_en.ts
@@ -1,4 +1,6 @@
-
+
+
+BootInfoWidget
@@ -45,6 +47,14 @@
%1 (%2)
+
+ Calamares::BlankViewStep
+
+
+
+
+
+Calamares::DebugWindow
@@ -97,7 +107,7 @@
Calamares::ExecutionViewStep
-
+ Install
@@ -105,7 +115,7 @@
Calamares::JobThread
-
+ Done
@@ -113,12 +123,12 @@
Calamares::ProcessJob
-
+ Run command %1 %2
-
+ Running command %1 %2
@@ -126,32 +136,32 @@
Calamares::PythonJob
-
+ Running %1 operation.
-
+ Bad working directory path
-
+ Working directory %1 for python job %2 is not readable.
-
+ Bad main script file
-
+ Main script file %1 for python job %2 is not readable.
-
+ Boost.Python error in job "%1".
@@ -159,97 +169,112 @@
Calamares::ViewManager
-
+ &Back
-
-
+
+ &Next
-
-
+
+ &Cancel
-
-
+
+ Cancel installation without changing the system.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ &Install
-
+ Cancel installation?
-
+ Do you really want to cancel the current install process?
The installer will quit and all changes will be lost.
-
+ &Yes
-
+ &No
-
+ &Close
-
+ Continue with setup?
-
+ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong>
-
+ &Install now
-
+ Go &back
-
+ &Done
-
+ The installation is complete. Close the installer.
-
+ Error
-
+ Installation Failed
@@ -436,17 +461,17 @@ The installer will quit and all changes will be lost.
ClearMountsJob
-
+ Clear mounts for partitioning operations on %1
-
+ Clearing mounts for partitioning operations on %1.
-
+ Cleared all mounts for %1
@@ -554,27 +579,27 @@ The installer will quit and all changes will be lost.
Si&ze:
-
+ En&crypt
-
+ Logical
-
+ Primary
-
+ GPT
-
+ Mountpoint already in use. Please select another one.
@@ -776,7 +801,7 @@ The installer will quit and all changes will be lost.
DummyCppJob
-
+ Dummy C++ Job
@@ -834,7 +859,7 @@ The installer will quit and all changes will be lost.
Flags:
-
+ Mountpoint already in use. Please select another one.
@@ -1003,12 +1028,12 @@ The installer will quit and all changes will be lost.
KeyboardPage
-
+ Set keyboard model to %1.<br/>
-
+ Set keyboard layout to %1/%2.
@@ -1052,64 +1077,64 @@ The installer will quit and all changes will be lost.
Form
-
+ I accept the terms and conditions above.
-
+ <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms.
-
+ Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue.
-
+ <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience.
-
+ Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead.
-
+ %1 is an untranslatable product name, example: Creative Audigy driver<strong>%1 driver</strong><br/>by %2
-
+ %1 is usually a vendor name, example: Nvidia graphics driver<strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 codec</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1 package</strong><br/><font color="Grey">by %2</font>
-
+ <strong>%1</strong><br/><font color="Grey">by %2</font>
-
+ <a href="%1">view license agreement</a>
@@ -1583,34 +1608,34 @@ The installer will quit and all changes will be lost.
PartitionModel
-
-
+
+ Free Space
-
-
+
+ New partition
-
+ Name
-
+ File System
-
+ Mount Point
-
+ Size
@@ -1639,8 +1664,8 @@ The installer will quit and all changes will be lost.
-
- &Create
+
+
@@ -1658,17 +1683,17 @@ The installer will quit and all changes will be lost.
Install boot &loader on:
-
+ Are you sure you want to create a new partition table on %1?
-
+ Can not create new partition
-
+ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead.
@@ -1676,97 +1701,97 @@ The installer will quit and all changes will be lost.
PartitionViewStep
-
+ Gathering system information...
-
+ Partitions
-
+ Install %1 <strong>alongside</strong> another operating system.
-
+ <strong>Erase</strong> disk and install %1.
-
+ <strong>Replace</strong> a partition with %1.
-
+ <strong>Manual</strong> partitioning.
-
+ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3).
-
+ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1.
-
+ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1.
-
+ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2).
-
+ Disk <strong>%1</strong> (%2)
-
+ Current:
-
+ After:
-
+ No EFI system partition configured
-
+ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start.
-
+ EFI system partition flag not set
-
+ An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start.
-
+ Boot partition not encrypted
-
+ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window.
@@ -1912,22 +1937,22 @@ Output:
Default
-
+ unknown
-
+ extended
-
+ unformatted
-
+ swap
@@ -2109,29 +2134,29 @@ Output:
SetHostNameJob
-
+ Set hostname %1
-
+ Set hostname <strong>%1</strong>.
-
+ Setting hostname %1.
-
-
+
+ Internal Error
-
-
+
+ Cannot write hostname to target system
@@ -2583,9 +2608,9 @@ Output:
WelcomeViewStep
-
+ Welcome
-
\ No newline at end of file
+
diff --git a/lang/calamares_es_MX.ts b/lang/calamares_es_MX.ts
index 657507b9d..ddb6247d7 100644
--- a/lang/calamares_es_MX.ts
+++ b/lang/calamares_es_MX.ts
@@ -343,7 +343,7 @@ El instalador terminará y se perderán todos los cambios.
- %1 será reducido a %2MB y una nueva partición de %3MB será creado para %4.
+ %1 será reducido a %2MB y una nueva partición %3MB will be created for %4.
@@ -439,12 +439,12 @@ El instalador terminará y se perderán todos los cambios.
- Despejar puntos de montaje para operaciones de particionamiento en %1
+ Borrar puntos de montaje para operaciones de particionamiento en %1
- Despejando puntos de montaje para operaciones de particionamiento en %1
+ Borrando puntos de montaje para operaciones de particionamiento en %1.
@@ -499,7 +499,7 @@ El instalador terminará y se perderán todos los cambios.
- Tareas de procesos contextuales.
+ Tareas de procesos contextuales
@@ -507,7 +507,7 @@ El instalador terminará y se perderán todos los cambios.
- Crear una partición
+ Crear una Partición
@@ -636,7 +636,7 @@ El instalador terminará y se perderán todos los cambios.
- Crear nueva tabla de particiones %1 en %2
+ Crear nueva tabla de partición %1 en %2.
@@ -878,7 +878,7 @@ El instalador terminará y se perderán todos los cambios.
- Instalar %1 en <strong>nueva</strong> partición de sistema %2.
+ Instalar %1 en <strong>nueva</strong> %2 partición de sistema.
@@ -1714,7 +1714,7 @@ El instalador terminará y se perderán todos los cambios.
- <strong>Borrar</strong> el disco <strong>%2<strong> (%3) e instalar %1.
+ <strong>Borrar</strong> el disco <strong>%2<strong> (%3) e instalar %1.
diff --git a/lang/calamares_ko.ts b/lang/calamares_ko.ts
index 73b81b498..f2f9d6a49 100644
--- a/lang/calamares_ko.ts
+++ b/lang/calamares_ko.ts
@@ -22,27 +22,27 @@
-
+ %1의 마스터 부트 레코드
-
+ 부트 파티션
-
+ 시스템 파티션
-
+ 부트로더를 설치하지 않습니다
-
+ %1 (%2)
@@ -55,22 +55,22 @@
-
+ 전역 스토리지
-
+ 작업 대기열
-
+ 모듈
-
+ 유형:
@@ -81,17 +81,17 @@
-
+ 인터페이스:
-
+ 도구
-
+ 디버깅 정보
@@ -99,7 +99,7 @@
-
+ 설치
@@ -107,7 +107,7 @@
-
+ 완료
@@ -128,32 +128,32 @@
-
+ %1 명령을 실행 중
-
+ 잘못된 작업 디렉터리 경로
-
+ 파이썬 작업 %2에 대한 작업 디렉터리 %1을 읽을 수 없습니다.
-
+ 잘못된 주 스크립트 파일
-
+ 파이썬 작업 %2에 대한 주 스크립트 파일 %1을 읽을 수 없습니다.
-
+ 작업 "%1"에서 Boost.Python 오류
@@ -161,61 +161,62 @@
-
+ 뒤로(&B)
-
+ 다음(&N)
-
+ 취소(&C)
-
+ 시스템 변경 없이 설치를 취소합니다.
-
+ 설치(&I)
-
+ 설치를 취소하시겠습니까?
-
+ 정말로 현재 설치 프로세스를 취소하시겠습니까?
+설치 관리자가 종료되며 모든 변경은 반영되지 않습니다.
-
+ 예(&Y)
-
+ 아니오(&N)
-
+ 닫기(&C)
-
+ 설치를 계속하시겠습니까?
@@ -225,32 +226,32 @@ The installer will quit and all changes will be lost.
-
+ 지금 설치(&I)
-
+ 뒤로 이동(&b)
-
+ 완료(&D)
-
+ 설치가 완료되었습니다. 설치 관리자를 닫습니다.
-
+ 오류
-
+ 설치 실패
@@ -258,22 +259,22 @@ The installer will quit and all changes will be lost.
-
+ 알 수 없는 예외 유형
-
+ 구문 분석할 수 없는 파이썬 오류
-
+ 구문 분석할 수 없는 파이썬 역추적 정보
-
+ 가져올 수 없는 파이썬 오류
@@ -281,12 +282,12 @@ The installer will quit and all changes will be lost.
-
+ %1 설치 관리자
-
+ 디버깅 정보 보기
@@ -314,7 +315,7 @@ The installer will quit and all changes will be lost.
-
+ 시스템 요구 사항
@@ -327,7 +328,7 @@ The installer will quit and all changes will be lost.
-
+ 이후:
@@ -337,7 +338,7 @@ The installer will quit and all changes will be lost.
-
+ 부트 로더 위치:
@@ -347,7 +348,7 @@ The installer will quit and all changes will be lost.
-
+ 스토리지 장치 선택
@@ -355,7 +356,7 @@ The installer will quit and all changes will be lost.
-
+ 현재:
@@ -380,12 +381,12 @@ The installer will quit and all changes will be lost.
-
+ %1의 EFI 시스템 파티션은 %2의 시작으로 사용될 것입니다.
-
+ EFI 시스템 파티션:
@@ -437,17 +438,17 @@ The installer will quit and all changes will be lost.
-
+ 파티셔닝 작업을 위해 %1의 마운트를 모두 해제합니다
-
+ 파티셔닝 작업을 위해 %1의 마운트를 모두 해제하는 중입니다.
-
+ %1의 모든 마운트가 해제되었습니다.
@@ -455,22 +456,22 @@ The installer will quit and all changes will be lost.
-
+ 모든 임시 마운트들을 해제합니다
-
+ 모든 임시 마운트들이 해제하는 중입니다.
-
+ 임시 마운트들의 목록을 가져올 수 없습니다.
-
+ 모든 임시 마운트들이 해제되었습니다.
@@ -479,17 +480,17 @@ The installer will quit and all changes will be lost.
-
+ 명령을 실행할 수 없습니다.
-
+ 이 명령은 호스트 환경에서 실행되며 루트 경로를 알아야하지만, rootMountPoint가 정의되지 않았습니다.
-
+ 이 명령은 사용자 이름을 알아야 하지만, username이 정의되지 않았습니다.
@@ -497,7 +498,7 @@ The installer will quit and all changes will be lost.
-
+ 컨텍스트 프로세스 작업
@@ -505,77 +506,77 @@ The installer will quit and all changes will be lost.
-
+ 파티션 생성
-
+ MiB
-
+ 파티션 유형(&T):
-
+ 주 파티션(&P)
-
+ 확장 파티션(&E)
-
+ 파일 시스템(&l):
-
+ LVM 논리 볼륨 이름
-
+ 플래그:
-
+ 마운트 지점(&M):
-
+ 크기(&z):
-
+ 암호화(&c)
-
+ 논리 파티션
-
+ 주 파티션
-
+ GPT
-
+ 마운트 위치가 이미 사용 중입니다. 다른 위치를 선택해주세요.
@@ -606,27 +607,27 @@ The installer will quit and all changes will be lost.
-
+ 파티션 테이블을 만듭니다
-
+ 새로운 파티션 테이블의 생성은 디스크에 있는 모든 데이터를 지울 것입니다.
-
+ 만들고자 하는 파티션 테이블의 종류는 무엇인가요?
-
+ 마스터 부트 레코드 (MBR)
-
+ GUID 파티션 테이블 (GPT)
@@ -634,22 +635,22 @@ The installer will quit and all changes will be lost.
-
+ %2에 %1 파티션 테이블을 만듭니다.
-
+ <strong>%2</strong>에 새로운 <strong>%1</strong> 파티션 테이블을 만듭니다 (%3).
-
+ %2에 새로운 %1 파티션 테이블을 만드는 중입니다.
-
+ 설치 관리자가 %1에 파티션 테이블을 만들지 못했습니다.
@@ -657,37 +658,37 @@ The installer will quit and all changes will be lost.
-
+ %1 사용자를 만듭니다
-
+ <strong>%1</strong>사용자를 만듭니다 .
-
+ %1 사용자를 만드는 중입니다.
-
+ Sudoers 디렉터리가 쓰기 금지되어 있습니다.
-
+ sudoers 파일을 만들 수가 없습니다.
-
+ sudoers 파일의 권한을 변경할 수 없습니다.
-
+ groups 파일을 읽을 수가 없습니다.
@@ -695,22 +696,22 @@ The installer will quit and all changes will be lost.
-
+ %1 파티션을 지웁니다.
-
+ <strong>%1</strong> 파티션을 지웁니다.
-
+ %1 파티션을 지우는 중입니다.
-
+ 설치 관리자가 %1 파티션을 지우지 못했습니다.
@@ -723,7 +724,7 @@ The installer will quit and all changes will be lost.
-
+ 이 장치는 <strong>%1</strong> 파티션 테이블을 갖고 있습니다.
@@ -769,7 +770,7 @@ The installer will quit and all changes will be lost.
-
+ %1을 열지 못했습니다
@@ -777,7 +778,7 @@ The installer will quit and all changes will be lost.
-
+ 더미 C++ 작업
@@ -785,57 +786,57 @@ The installer will quit and all changes will be lost.
-
+ 기존 파티션을 수정합니다
-
+ 내용:
-
+ 유지(&K)
-
+ 포맷
-
+ 경고: 파티션을 포맷하는 것은 모든 데이터를 지울 것입니다.
-
+ 마운트 위치(&M):
-
+ 크기(&z):
-
+ MiB
-
+ 파일 시스템(&l):
-
+ 플래그:
-
+ 마운트 위치가 이미 사용 중입니다. 다른 위치를 선택해주세요.
@@ -848,22 +849,22 @@ The installer will quit and all changes will be lost.
-
+ 시스템 암호화(&c)
-
+ 암호
-
+ 암호 확인
-
+ 암호와 암호 확인 상자에 동일한 값을 입력해주세요.
@@ -871,7 +872,7 @@ The installer will quit and all changes will be lost.
-
+ 파티션 정보 설정
@@ -901,7 +902,7 @@ The installer will quit and all changes will be lost.
-
+ 마운트 위치를 설정 중입니다.
@@ -919,7 +920,7 @@ The installer will quit and all changes will be lost.
-
+ 지금 재시작(&R)
@@ -937,17 +938,17 @@ The installer will quit and all changes will be lost.
-
+ 완료
-
+ 설치 완료
-
+ %1의 설치가 완료되었습니다.
@@ -965,12 +966,12 @@ The installer will quit and all changes will be lost.
-
+ %1 파티션을 %2 파일 시스템으로 포맷하는 중입니다.
-
+ 설치 관리자가 '%2' 디스크에 있는 %1 파티션을 포맷하지 못했습니다.
@@ -978,17 +979,17 @@ The installer will quit and all changes will be lost.
-
+ Konsole이 설치되지 않았음
-
+ KDE Konsole을 설치한 후에 다시 시도해주세요!
-
+ 스크립트 실행: <code>%1</code>
@@ -996,7 +997,7 @@ The installer will quit and all changes will be lost.
-
+ 스크립트
@@ -1004,12 +1005,12 @@ The installer will quit and all changes will be lost.
-
+ 키보드 모델을 %1로 설정합니다.<br/>
-
+ 키보드 레이아웃을 %1/%2로 설정합니다.
@@ -1017,7 +1018,7 @@ The installer will quit and all changes will be lost.
-
+ 키보드
@@ -1025,7 +1026,7 @@ The installer will quit and all changes will be lost.
-
+ 시스템 로케일 설정
@@ -1035,12 +1036,12 @@ The installer will quit and all changes will be lost.
-
+ 취소(&C)
-
+ 확인(&O)
@@ -1053,27 +1054,27 @@ The installer will quit and all changes will be lost.
-
+ 상기 계약 조건을 모두 동의합니다.
-
+ <h1>라이센스 동의</h1>이 설치 절차는 라이센스 조항의 적용을 받는 독점 소프트웨어를 설치합니다.
-
+ 상기 최종 사용자 라이센스 동의 (EULAs) 를 검토해주시길 바랍니다.<br/>조건에 동의하지 않는다면, 설치 절차를 계속할 수 없습니다.
-
+ <h1>라이센스 동의</h1>이 설치 절차는 추가적인 기능들을 제공하고 사용자 환경을 개선하기 위한 독점 소프트웨어를 설치할 수 있으며, 이 소프트웨어는 라이센스 조항의 적용을 받습니다.
-
+ 상기 최종 사용자 라이센스 동의 (EULAs) 를 검토해주시길 바랍니다. <br/>조건에 동의하지 않는다면, 독점 소프트웨어는 설치되지 않을 것이며, 대체하여 사용할 수 있는 오픈 소스 소프트웨어가 사용될 것입니다.
@@ -1110,7 +1111,7 @@ The installer will quit and all changes will be lost.
-
+ <a href="%1">라이센스 동의 보기</a>
@@ -1118,7 +1119,7 @@ The installer will quit and all changes will be lost.
-
+ 라이센스
@@ -1126,39 +1127,39 @@ The installer will quit and all changes will be lost.
-
+ 시스템 언어가 %1로 설정될 것입니다.
-
+ 숫자와 날짜 로케일이 %1로 설정될 것입니다.
-
+ 대륙:
-
+ 표준시간대:
-
+ 변경(&C)...
-
+ 표준시간대를 %1/%2로 설정합니다.<br/>Language (Country)
-
+ %1 (%2)
@@ -1166,12 +1167,12 @@ The installer will quit and all changes will be lost.
-
+ 위치 정보를 불러오는 중입니다...
-
+ 위치
@@ -1179,22 +1180,22 @@ The installer will quit and all changes will be lost.
-
+ 이름
-
+ 설명
-
+ 네트워크 설치. (불가: 패키지 목록을 가져올 수 없습니다. 네트워크 연결을 확인해주세요)
-
+ 네트워크 설치. (불가: 유효하지 않은 그룹 데이터를 수신했습니다)
@@ -1202,7 +1203,7 @@ The installer will quit and all changes will be lost.
-
+ 패키지 선택
@@ -1210,102 +1211,102 @@ The installer will quit and all changes will be lost.
-
+ 암호가 너무 짧습니다
-
+ 암호가 너무 깁니다
-
+ 암호가 너무 취약합니다
-
+ '%1'을 설정하는 중 메모리 할당 오류
-
+ 메모리 할당 오류
-
+ 암호가 이전과 같습니다
-
+ 암호가 회문입니다
-
+ 암호가 대소문자만 다릅니다
-
+ 암호가 이전 암호와 너무 유사합니다
-
+ 암호가 사용자 이름의 일부를 포함하고 있습니다.
-
+ 암호가 사용자 실명의 일부를 포함하고 있습니다
-
+ 암호가 금지된 단어를 포함하고 있습니다
-
+ 암호가 %1개 미만의 숫자를 포함하고 있습니다
-
+ 암호가 너무 적은 개수의 숫자들을 포함하고 있습니다
-
+ 암호가 %1개 미만의 대문자를 포함하고 있습니다
-
+ 암호가 너무 적은 개수의 대문자를 포함하고 있습니다
-
+ 암호가 %1개 미만의 소문자를 포함하고 있습니다
-
+ 암호가 너무 적은 개수의 소문자를 포함하고 있습니다
-
+ 암호가 %1개 미만의 영숫자가 아닌 문자를 포함하고 있습니다
-
+ 암호가 너무 적은 개수의 영숫자가 아닌 문자를 포함하고 있습니다
@@ -1440,12 +1441,12 @@ The installer will quit and all changes will be lost.
-
+ 치명적인 실패
-
+ 알 수 없는 오류
@@ -1458,12 +1459,12 @@ The installer will quit and all changes will be lost.
-
+ 키보드 모델:
-
+ 키보드를 테스트하기 위해 여기에 입력하세요
@@ -1476,12 +1477,12 @@ The installer will quit and all changes will be lost.
-
+ 이름이 무엇인가요?
-
+ 로그인을 위해 어떤 이름을 사용할 것인가요?
@@ -1493,12 +1494,12 @@ The installer will quit and all changes will be lost.
-
+ <small>한명 이상의 사용자가 이 컴퓨터를 사용할 것이라면, 설치 후에 여러 사용자 계정을 설정할 수 있습니다.</small>
-
+ 사용자 계정의 보안을 유지하기 위한 암호를 선택하세요.
@@ -1508,7 +1509,7 @@ The installer will quit and all changes will be lost.
-
+ 이 컴퓨터의 이름은 무엇인가요?
@@ -1518,22 +1519,22 @@ The installer will quit and all changes will be lost.
-
+ 암호를 묻지 않고 자동으로 로그인합니다.
-
+ 관리자 계정에 대해 같은 암호를 사용합니다.
-
+ 관리자 계정을 위한 암호를 선택하세요.
-
+ <small>입력 오류를 검사하기 위해 암호를 똑같이 두번 입력하세요.</small>
@@ -1541,37 +1542,37 @@ The installer will quit and all changes will be lost.
-
+ 루트
-
+ 홈
-
+ 부트
-
+ EFI 시스템
-
+ 스왑
-
+ %1에 대한 새로운 파티션
-
+ 새로운 파티션
@@ -1585,33 +1586,33 @@ The installer will quit and all changes will be lost.
-
+ 여유 공간
-
+ 새로운 파티션
-
+ 이름
-
+ 파일 시스템
-
+ 마운트 위치
-
+ 크기
@@ -1624,37 +1625,37 @@ The installer will quit and all changes will be lost.
-
+ 스토리지 장치(&v):
-
+ 모든 변경 되돌리기(&R)
-
+ 새로운 파티션 테이블(&T)
-
+ 생성(&C)
-
+ 수정(&E)
-
+ 삭제(&D)
-
+ 부트 로더 설치 위치(&l):
@@ -1664,7 +1665,7 @@ The installer will quit and all changes will be lost.
-
+ 새로운 파티션을 만들 수 없습니다
@@ -1677,12 +1678,12 @@ The installer will quit and all changes will be lost.
-
+ 시스템 정보 수집 중...
-
+ 파티션
@@ -1732,17 +1733,17 @@ The installer will quit and all changes will be lost.
-
+ 현재:
-
+ 이후:
-
+ EFI 시스템 파티션이 설정되지 않았습니다
@@ -1752,7 +1753,7 @@ The installer will quit and all changes will be lost.
-
+ EFI 시스템 파티션 플래그가 설정되지 않았습니다
@@ -1762,7 +1763,7 @@ The installer will quit and all changes will be lost.
-
+ 부트 파티션이 암호화되지 않았습니다
@@ -1775,13 +1776,13 @@ The installer will quit and all changes will be lost.
-
+ 플라즈마 Look-and-Feel 작업
-
+ KDE 플라즈마 Look-and-Feel 패키지를 선택할 수 없습니다
@@ -1807,7 +1808,7 @@ The installer will quit and all changes will be lost.
-
+ Look-and-Feel
@@ -1815,17 +1816,17 @@ The installer will quit and all changes will be lost.
-
+ 나중을 위해 파일들을 저장하는 중...
-
+ 나중을 위해 저장될 설정된 파일들이 없습니다.
-
+ 모든 설정된 파일들이 보존되는 것은 아닙니다.
@@ -1834,39 +1835,42 @@ The installer will quit and all changes will be lost.
-
+
+명령으로부터 아무런 출력이 없습니다.
-
+
+출력:
+
-
+ 외부 명령이 실패했습니다.
-
+ <i>%1</i> 명령이 실패했습니다.
-
+ 외부 명령을 시작하지 못했습니다.
-
+ <i>%1</i> 명령을 시작하지 못했습니다.
-
+ 명령을 시작하는 중에 내부 오류가 발생했습니다.
@@ -1876,22 +1880,22 @@ Output:
-
+ 외부 명령을 완료하지 못했습니다.
-
+ <i>%1</i> 명령을 %2초 안에 완료하지 못했습니다.
-
+ 외부 명령이 오류와 함께 완료되었습니다.
-
+ <i>%1</i> 명령이 종료 코드 %2와 함께 완료되었습니다.
@@ -1899,18 +1903,18 @@ Output:
-
+ 기본 키보드 모델
-
+ 기본
-
+ 알 수 없음
@@ -1948,37 +1952,37 @@ Output:
-
+ 선택된 항목은 유효한 파티션으로 표시되지 않습니다.
-
+ %1은 빈 공간에 설치될 수 없습니다. 존재하는 파티션을 선택해주세요.
-
+ %1은 확장 파티션에 설치될 수 없습니다. 주 파티션 혹은 논리 파티션을 선택해주세요.
-
+ %1은 이 파티션에 설치될 수 없습니다.
-
+ 데이터 파티션 (%1)
-
+ 알 수 없는 시스템 파티션 (%1)
-
+ %1 시스템 파티션 (%2)
@@ -2000,12 +2004,12 @@ Output:
-
+ %1의 EFI 시스템 파티션은 %2의 시작으로 사용될 것입니다.
-
+ EFI 시스템 파티션:
@@ -2013,57 +2017,57 @@ Output:
-
+ 시스템 정보 수집 중...
-
+ 최소 %1 GB의 여유 공간이 필요합니다.
-
+ 저장 공간이 충분하지 않습니다. 최소 %1 GB의 공간이 필요합니다.
-
+ 최소 %1 GB의 가용 메모리가 필요합니다
-
+ 이 시스템은 가용 메모리가 충분하지 않습니다. 최소 %1 GB의 가용 메모리가 필요합니다.
-
+ 전원 공급이 연결되어 있습니다
-
+ 이 시스템은 전원 공급이 연결되어 있지 않습니다
-
+ 인터넷에 연결되어 있습니다
-
+ 이 시스템은 인터넷에 연결되어 있지 않습니다.
-
+ 설치 관리자가 관리자 권한으로 동작하고 있지 않습니다.
-
+ 설치 관리자를 표시하기에 화면이 너무 작습니다.
@@ -2094,12 +2098,12 @@ Output:
-
+ 스토리지 장치 검색 중...
-
+ 파티셔닝
@@ -2107,29 +2111,29 @@ Output:
-
+ 호스트 이름을 %1로 설정합니다
-
+ 호스트 이름을 <strong>%1</strong>로 설정합니다.
-
+ 호스트 이름을 %1로 설정하는 중입니다.
-
+ 내부 오류
-
+ 시스템의 호스트 이름을 저장할 수 없습니다
@@ -2137,29 +2141,29 @@ Output:
-
+ 키보드 모델을 %1로 설정하고, 레이아웃을 %2-%3으로 설정합니다
-
+ 가상 콘솔을 위한 키보드 설정을 저장할 수 없습니다.
-
+ %1에 쓰기를 실패했습니다
-
+ X11에 대한 키보드 설정을 저장하지 못했습니다.
-
+ /etc/default 디렉터리에 키보드 설정을 저장하지 못했습니다.
@@ -2293,37 +2297,37 @@ Output:
-
+ 표준시간대를 %1/%2로 설정합니다
-
+ 선택된 표준시간대 경로에 접근할 수 없습니다.
-
+ 잘못된 경로: %1
-
+ 표준 시간대를 설정할 수 없습니다.
-
+ 링크 생성 실패, 대상: %1; 링크 이름: %2
-
+ 표준시간대를 설정할 수 없습니다,
-
+ /etc/timezone을 쓰기를 위해 열 수 없습니다.
@@ -2331,7 +2335,7 @@ Output:
-
+ 셸 처리 작업
@@ -2356,7 +2360,7 @@ Output:
-
+ 요약
@@ -2364,12 +2368,12 @@ Output:
-
+ 설치 피드백
-
+ 설치 피드백을 보내는 중입니다.
@@ -2379,7 +2383,7 @@ Output:
-
+ HTTP 요청 시간이 만료되었습니다.
@@ -2387,28 +2391,28 @@ Output:
-
+ 장치 피드백
-
+ 장치 피드백을 설정하는 중입니다.
-
+ 장치 피드백 설정 중에 오류가 발생했습니다.
-
+ 장치 피드백을 정확하게 설정할 수 없습니다, %1 스크립트 오류.
-
+ 장치 피드백을 정확하게 설정할 수 없습니다, %1 깔라마레스 오류.
@@ -2440,7 +2444,7 @@ Output:
-
+ ...
@@ -2473,7 +2477,7 @@ Output:
-
+ 피드백
@@ -2481,33 +2485,33 @@ Output:
-
+ 사용자 이름이 너무 깁니다.
-
+ 사용자 이름이 유효하지 않은 문자들을 포함하고 있습니다. 소문자 그리고 숫자만이 허용됩니다.
-
+ 호스트 이름이 너무 짧습니다.
-
+ 호스트 이름이 너무 깁니다.
-
+ 호트스 이름이 유효하지 않은 문자들을 포함하고 있습니다. 영문자, 숫자 그리고 붙임표(-)만이 허용됩니다.
-
+ 암호가 일치하지 않습니다!
@@ -2515,7 +2519,7 @@ Output:
-
+ 사용자
@@ -2528,42 +2532,42 @@ Output:
-
+ 언어(&L):
-
+ 출시 정보(&R)
-
+ 알려진 문제(&K)
-
+ 지원(&S)
-
+ 정보(&A)
-
+ <h1>%1 설치 관리자에 오신 것을 환영합니다.</h1>
-
+ <h1>%1을 위한 깔라마레스 설치 관리자에 오신 것을 환영합니다.</h1>
-
+ %1 설치 관리자에 대하여
@@ -2573,7 +2577,7 @@ Output:
-
+ %1 지원
@@ -2581,7 +2585,7 @@ Output:
-
+ 환영합니다
\ No newline at end of file
diff --git a/lang/calamares_ru.ts b/lang/calamares_ru.ts
index 4eb4ec417..ba9f715ff 100644
--- a/lang/calamares_ru.ts
+++ b/lang/calamares_ru.ts
@@ -1325,12 +1325,12 @@ The installer will quit and all changes will be lost.
-
+ Пароль содержит менее %1 классов символов
-
+ Пароль содержит недостаточно классов символов
@@ -1345,27 +1345,27 @@ The installer will quit and all changes will be lost.
-
+ Пароль содержит более %1 символов одного и того же класса последовательно
-
+ Пароль содержит слишком длинную последовательность символов одного и того же класса
-
+ Пароль содержит монотонную последовательность длиннее %1 символов
-
+ Пароль содержит слишком длинную монотонную последовательность символов
-
+ Не задан пароль
@@ -1841,7 +1841,9 @@ There was no output from the command.
-
+
+Вывод:
+
@@ -1856,17 +1858,17 @@ Output:
-
+ Не удалось запустить внешнюю команду.
-
+ Не удалось запустить команду <i>%1</i>.
-
+ Внутренняя ошибка при запуске команды.
@@ -1876,7 +1878,7 @@ Output:
-
+ Не удалось завершить внешнюю команду.
@@ -2364,12 +2366,12 @@ Output:
-
+ Отчёт об установке
-
+ Отправка отчёта об установке.
diff --git a/lang/python.pot b/lang/python.pot
index fab6d56ba..2062b9031 100644
--- a/lang/python.pot
+++ b/lang/python.pot
@@ -2,57 +2,57 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
-#
+#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-05-28 04:57-0400\n"
+"POT-Creation-Date: 2018-06-18 07:46-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: src/modules/umount/main.py:40
msgid "Unmount file systems."
-msgstr "Unmount file systems."
+msgstr ""
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
-msgstr "Dummy python job."
+msgstr ""
#: src/modules/dummypython/main.py:97
msgid "Dummy python step {}"
-msgstr "Dummy python step {}"
+msgstr ""
#: src/modules/machineid/main.py:35
msgid "Generate machine-id."
-msgstr "Generate machine-id."
+msgstr ""
-#: src/modules/packages/main.py:61
+#: src/modules/packages/main.py:62
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
-msgstr "Processing packages (%(count)d / %(total)d)"
+msgstr ""
-#: src/modules/packages/main.py:63 src/modules/packages/main.py:73
+#: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages."
-msgstr "Install packages."
+msgstr ""
-#: src/modules/packages/main.py:66
+#: src/modules/packages/main.py:67
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
-msgstr[0] "Installing one package."
-msgstr[1] "Installing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
-#: src/modules/packages/main.py:69
+#: src/modules/packages/main.py:70
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
-msgstr[0] "Removing one package."
-msgstr[1] "Removing %(num)d packages."
+msgstr[0] ""
+msgstr[1] ""
diff --git a/lang/python/hi/LC_MESSAGES/python.mo b/lang/python/hi/LC_MESSAGES/python.mo
index 5504f7715..5c85ef863 100644
Binary files a/lang/python/hi/LC_MESSAGES/python.mo and b/lang/python/hi/LC_MESSAGES/python.mo differ
diff --git a/lang/python/hi/LC_MESSAGES/python.po b/lang/python/hi/LC_MESSAGES/python.po
index a2a8bb3d4..d9f42caca 100644
--- a/lang/python/hi/LC_MESSAGES/python.po
+++ b/lang/python/hi/LC_MESSAGES/python.po
@@ -20,24 +20,24 @@ msgstr ""
#: src/modules/umount/main.py:40
msgid "Unmount file systems."
-msgstr ""
+msgstr "फ़ाइल सिस्टम माउंट से हटाएँ।"
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
-msgstr "Dummy python job."
+msgstr "डमी पाइथन प्रक्रिया ।"
#: src/modules/dummypython/main.py:97
msgid "Dummy python step {}"
-msgstr "Dummy python step {}"
+msgstr "डमी पाइथन प्रक्रिया की चरण संख्या {}"
#: src/modules/machineid/main.py:35
msgid "Generate machine-id."
-msgstr "machine-id generate करें।"
+msgstr "मशीन-आईडी उत्पन्न करें।"
#: src/modules/packages/main.py:61
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
-msgstr "पैकेज (%(count)d / %(total)d) process किए जा रहे हैं"
+msgstr "पैकेज (%(count)d / %(total)d) संसाधित किए जा रहे हैं"
#: src/modules/packages/main.py:63 src/modules/packages/main.py:73
msgid "Install packages."
diff --git a/lang/python/ko/LC_MESSAGES/python.mo b/lang/python/ko/LC_MESSAGES/python.mo
index 9dfa007bd..a11c754cf 100644
Binary files a/lang/python/ko/LC_MESSAGES/python.mo and b/lang/python/ko/LC_MESSAGES/python.mo differ
diff --git a/lang/python/ko/LC_MESSAGES/python.po b/lang/python/ko/LC_MESSAGES/python.po
index 7ac2b3d4d..a880b2af1 100644
--- a/lang/python/ko/LC_MESSAGES/python.po
+++ b/lang/python/ko/LC_MESSAGES/python.po
@@ -10,6 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-28 04:57-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Ji-Hyeon Gim , 2018\n"
"Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,37 +20,37 @@ msgstr ""
#: src/modules/umount/main.py:40
msgid "Unmount file systems."
-msgstr ""
+msgstr "파일 시스템 마운트를 해제합니다."
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
-msgstr ""
+msgstr "더미 파이썬 작업."
#: src/modules/dummypython/main.py:97
msgid "Dummy python step {}"
-msgstr ""
+msgstr "더미 파이썬 단계 {}"
#: src/modules/machineid/main.py:35
msgid "Generate machine-id."
-msgstr ""
+msgstr "장치 식별자를 생성합니다."
#: src/modules/packages/main.py:61
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
-msgstr ""
+msgstr "패키지들을 처리하는 중입니다 (%(count)d / %(total)d)"
#: src/modules/packages/main.py:63 src/modules/packages/main.py:73
msgid "Install packages."
-msgstr ""
+msgstr "패키지들을 설치합니다."
#: src/modules/packages/main.py:66
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
-msgstr[0] ""
+msgstr[0] "%(num)d개의 패키지들을 설치하는 중입니다."
#: src/modules/packages/main.py:69
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
-msgstr[0] ""
+msgstr[0] "%(num)d개의 패키지들을 제거하는 중입니다."
diff --git a/src/libcalamares/Settings.cpp b/src/libcalamares/Settings.cpp
index 80f6836bb..1fdfc6daa 100644
--- a/src/libcalamares/Settings.cpp
+++ b/src/libcalamares/Settings.cpp
@@ -29,13 +29,19 @@
#include
+static bool
+hasValue( const YAML::Node& v )
+{
+ return v.IsDefined() && !v.IsNull();
+}
/** Helper function to grab a QString out of the config, and to warn if not present. */
static QString
requireString( const YAML::Node& config, const char* key )
{
- if ( config[ key ] )
- return QString::fromStdString( config[ key ].as< std::string >() );
+ auto v = config[ key ];
+ if ( hasValue(v) )
+ return QString::fromStdString( v.as< std::string >() );
else
{
cWarning() << "Required settings.conf key" << key << "is missing.";
@@ -47,8 +53,9 @@ requireString( const YAML::Node& config, const char* key )
static bool
requireBool( const YAML::Node& config, const char* key, bool d )
{
- if ( config[ key ] )
- return config[ key ].as< bool >();
+ auto v = config[ key ];
+ if ( hasValue(v) )
+ return v.as< bool >();
else
{
cWarning() << "Required settings.conf key" << key << "is missing.";
@@ -175,7 +182,7 @@ Settings::Settings( const QString& settingsFilePath,
m_brandingComponentName = requireString( config, "branding" );
m_promptInstall = requireBool( config, "prompt-install", false );
- m_doChroot = requireBool( config, "dont-chroot", true );
+ m_doChroot = !requireBool( config, "dont-chroot", false );
}
catch ( YAML::Exception& e )
{
diff --git a/src/libcalamaresui/modulesystem/CppJobModule.cpp b/src/libcalamaresui/modulesystem/CppJobModule.cpp
index 9799066e7..3a48e29f2 100644
--- a/src/libcalamaresui/modulesystem/CppJobModule.cpp
+++ b/src/libcalamaresui/modulesystem/CppJobModule.cpp
@@ -26,7 +26,8 @@
#include
#include
-namespace Calamares {
+namespace Calamares
+{
Module::Type
@@ -55,7 +56,7 @@ CppJobModule::loadSelf()
return;
}
- CppJob *cppJob = pf->create< Calamares::CppJob >();
+ CppJob* cppJob = pf->create< Calamares::CppJob >();
if ( !cppJob )
{
cDebug() << Q_FUNC_INFO << m_loader->errorString();
@@ -68,7 +69,7 @@ CppJobModule::loadSelf()
cppJob->setModuleInstanceKey( instanceKey() );
cppJob->setConfigurationMap( m_configurationMap );
- m_job = Calamares::job_ptr( static_cast< Calamares::Job * >( cppJob ) );
+ m_job = Calamares::job_ptr( static_cast< Calamares::Job* >( cppJob ) );
m_loaded = true;
cDebug() << "CppJobModule" << instanceKey() << "loading complete.";
}
diff --git a/src/libcalamaresui/modulesystem/Module.cpp b/src/libcalamaresui/modulesystem/Module.cpp
index 9b3be877f..c820b98b3 100644
--- a/src/libcalamaresui/modulesystem/Module.cpp
+++ b/src/libcalamaresui/modulesystem/Module.cpp
@@ -71,8 +71,7 @@ Module::fromDescriptor( const QVariantMap& moduleDescriptor,
QString typeString = moduleDescriptor.value( "type" ).toString();
QString intfString = moduleDescriptor.value( "interface" ).toString();
- if ( typeString.isEmpty() ||
- intfString.isEmpty() )
+ if ( typeString.isEmpty() || intfString.isEmpty() )
{
cError() << "Bad module descriptor format" << instanceId;
return nullptr;
@@ -80,9 +79,7 @@ Module::fromDescriptor( const QVariantMap& moduleDescriptor,
if ( ( typeString == "view" ) || ( typeString == "viewmodule" ) )
{
if ( intfString == "qtplugin" )
- {
m.reset( new ViewModule() );
- }
else if ( intfString == "pythonqt" )
{
#ifdef WITH_PYTHONQT
@@ -97,13 +94,9 @@ Module::fromDescriptor( const QVariantMap& moduleDescriptor,
else if ( typeString == "job" )
{
if ( intfString == "qtplugin" )
- {
m.reset( new CppJobModule() );
- }
else if ( intfString == "process" )
- {
m.reset( new ProcessJobModule() );
- }
else if ( intfString == "python" )
{
#ifdef WITH_PYTHON
@@ -121,8 +114,8 @@ Module::fromDescriptor( const QVariantMap& moduleDescriptor,
if ( !m )
{
cError() << "Bad module type (" << typeString
- << ") or interface string (" << intfString
- << ") for module " << instanceId;
+ << ") or interface string (" << intfString
+ << ") for module " << instanceId;
return nullptr;
}
@@ -168,8 +161,7 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex
{
configFilesByPriority.append(
QDir( QDir::currentPath() ).absoluteFilePath(
- QString( "src/modules/%1/%2" ).arg( m_name )
- .arg( configFileName ) ) );
+ QString( "src/modules/%1/%2" ).arg( m_name ).arg( configFileName ) ) );
}
configFilesByPriority.append(
@@ -201,8 +193,8 @@ Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Ex
m_configurationMap = CalamaresUtils::yamlMapToVariant( doc ).toMap();
m_emergency = m_maybe_emergency
- && m_configurationMap.contains( EMERGENCY )
- && m_configurationMap[ EMERGENCY ].toBool();
+ && m_configurationMap.contains( EMERGENCY )
+ && m_configurationMap[ EMERGENCY ].toBool();
return;
}
else
@@ -228,8 +220,7 @@ Module::instanceId() const
QString
Module::instanceKey() const
{
- return QString( "%1@%2" ).arg( m_name )
- .arg( m_instanceId );
+ return QString( "%1@%2" ).arg( m_name ).arg( m_instanceId );
}
@@ -297,9 +288,7 @@ Module::initFrom( const QVariantMap& moduleDescriptor )
m_name = moduleDescriptor.value( "name" ).toString();
if ( moduleDescriptor.contains( EMERGENCY ) )
- {
m_maybe_emergency = moduleDescriptor[ EMERGENCY ].toBool();
- }
}
} //ns
diff --git a/src/libcalamaresui/modulesystem/Module.h b/src/libcalamaresui/modulesystem/Module.h
index 4fd0020f8..18c2e4cbe 100644
--- a/src/libcalamaresui/modulesystem/Module.h
+++ b/src/libcalamaresui/modulesystem/Module.h
@@ -147,7 +147,10 @@ public:
* @brief isLoaded reports on the loaded status of a module.
* @return true if the module's loading phase has finished, otherwise false.
*/
- bool isLoaded() const { return m_loaded; }
+ bool isLoaded() const
+ {
+ return m_loaded;
+ }
/**
* @brief loadSelf initialized the module.
@@ -164,7 +167,10 @@ public:
* are not run (in the common case where there is only
* one exec block, this doesn't really matter).
*/
- bool isEmergency() const { return m_emergency; }
+ bool isEmergency() const
+ {
+ return m_emergency;
+ }
/**
* @brief jobs returns any jobs exposed by this module.
diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp
index 6d13c9564..ed1e52f9f 100644
--- a/src/libcalamaresui/modulesystem/ModuleManager.cpp
+++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp
@@ -60,10 +60,8 @@ ModuleManager::ModuleManager( const QStringList& paths, QObject* parent )
ModuleManager::~ModuleManager()
{
// The map is populated with Module::fromDescriptor(), which allocates on the heap.
- for( auto moduleptr : m_loadedModulesByInstanceKey )
- {
+ for ( auto moduleptr : m_loadedModulesByInstanceKey )
delete moduleptr;
- }
}
@@ -119,14 +117,12 @@ ModuleManager::doInit()
else
{
cWarning() << "Cannot cd into module directory "
- << path << "/" << subdir;
+ << path << "/" << subdir;
}
}
}
else
- {
cDebug() << "ModuleManager bad search path" << path;
- }
}
// At this point m_availableModules is filled with whatever was found in the
// search paths.
@@ -182,10 +178,10 @@ ModuleManager::loadModules()
{
QStringList failedModules;
Settings::InstanceDescriptionList customInstances =
- Settings::instance()->customModuleInstances();
+ Settings::instance()->customModuleInstances();
const auto modulesSequence = Settings::instance()->modulesSequence();
- for ( const auto &modulePhase : modulesSequence )
+ for ( const auto& modulePhase : modulesSequence )
{
ModuleAction currentAction = modulePhase.first;
@@ -197,7 +193,7 @@ ModuleManager::loadModules()
QString instanceId;
QString configFileName;
if ( moduleEntrySplit.length() < 1 ||
- moduleEntrySplit.length() > 2 )
+ moduleEntrySplit.length() > 2 )
{
cError() << "Wrong module entry format for module" << moduleEntry;
failedModules.append( moduleEntry );
@@ -208,20 +204,20 @@ ModuleManager::loadModules()
configFileName = QString( "%1.conf" ).arg( moduleName );
if ( !m_availableDescriptorsByModuleName.contains( moduleName ) ||
- m_availableDescriptorsByModuleName.value( moduleName ).isEmpty() )
+ m_availableDescriptorsByModuleName.value( moduleName ).isEmpty() )
{
cError() << "Module" << moduleName << "not found in module search paths."
- << Logger::DebugList( m_paths );
+ << Logger::DebugList( m_paths );
failedModules.append( moduleName );
continue;
}
if ( moduleName != instanceId ) //means this is a custom instance
{
- if ( int found = findCustomInstance( customInstances, moduleName, instanceId ) > -1 )
- {
+ int found = findCustomInstance( customInstances, moduleName, instanceId );
+
+ if ( found > -1 )
configFileName = customInstances[ found ].value( "config" );
- }
else //ought to be a custom instance, but cannot find instance entry
{
cError() << "Custom instance" << moduleEntry << "not found in custom instances section.";
@@ -252,9 +248,7 @@ ModuleManager::loadModules()
}
if ( thisModule && thisModule->isLoaded() )
- {
cDebug() << "Module" << instanceKey << "already loaded.";
- }
else
{
thisModule =
@@ -316,10 +310,10 @@ ModuleManager::checkDependencies()
forever
{
for ( auto it = m_availableDescriptorsByModuleName.begin();
- it != m_availableDescriptorsByModuleName.end(); ++it )
+ it != m_availableDescriptorsByModuleName.end(); ++it )
{
foreach ( const QString& depName,
- (*it).value( "requiredModules" ).toStringList() )
+ ( *it ).value( "requiredModules" ).toStringList() )
{
if ( !m_availableDescriptorsByModuleName.contains( depName ) )
{
diff --git a/src/libcalamaresui/modulesystem/ProcessJobModule.cpp b/src/libcalamaresui/modulesystem/ProcessJobModule.cpp
index d8e171977..9037d85a6 100644
--- a/src/libcalamaresui/modulesystem/ProcessJobModule.cpp
+++ b/src/libcalamaresui/modulesystem/ProcessJobModule.cpp
@@ -22,7 +22,8 @@
#include
-namespace Calamares {
+namespace Calamares
+{
Module::Type
@@ -68,23 +69,17 @@ ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor )
m_workingPath = directory.absolutePath();
if ( !moduleDescriptor.value( "command" ).toString().isEmpty() )
- {
m_command = moduleDescriptor.value( "command" ).toString();
- }
m_secondsTimeout = 30;
if ( moduleDescriptor.contains( "timeout" ) &&
- !moduleDescriptor.value( "timeout" ).isNull() )
- {
+ !moduleDescriptor.value( "timeout" ).isNull() )
m_secondsTimeout = moduleDescriptor.value( "timeout" ).toInt();
- }
m_runInChroot = false;
if ( moduleDescriptor.contains( "chroot" )&&
- !moduleDescriptor.value( "chroot" ).isNull() )
- {
+ !moduleDescriptor.value( "chroot" ).isNull() )
m_runInChroot = moduleDescriptor.value( "chroot" ).toBool();
- }
}
diff --git a/src/libcalamaresui/modulesystem/PythonJobModule.cpp b/src/libcalamaresui/modulesystem/PythonJobModule.cpp
index 586eb6e27..7099a3f72 100644
--- a/src/libcalamaresui/modulesystem/PythonJobModule.cpp
+++ b/src/libcalamaresui/modulesystem/PythonJobModule.cpp
@@ -23,7 +23,8 @@
#include
-namespace Calamares {
+namespace Calamares
+{
Module::Type
@@ -46,9 +47,7 @@ PythonJobModule::loadSelf()
if ( m_loaded )
return;
- m_job = Calamares::job_ptr( new PythonJob( m_scriptFileName,
- m_workingPath,
- m_configurationMap ) );
+ m_job = Calamares::job_ptr( new PythonJob( m_scriptFileName, m_workingPath, m_configurationMap ) );
m_loaded = true;
}
@@ -68,9 +67,7 @@ PythonJobModule::initFrom( const QVariantMap& moduleDescriptor )
m_workingPath = directory.absolutePath();
if ( !moduleDescriptor.value( "script" ).toString().isEmpty() )
- {
m_scriptFileName = moduleDescriptor.value( "script" ).toString();
- }
}
diff --git a/src/libcalamaresui/modulesystem/PythonJobModule.h b/src/libcalamaresui/modulesystem/PythonJobModule.h
index 78678bcf8..38b10be83 100644
--- a/src/libcalamaresui/modulesystem/PythonJobModule.h
+++ b/src/libcalamaresui/modulesystem/PythonJobModule.h
@@ -23,7 +23,8 @@
#include "UiDllMacro.h"
-namespace Calamares {
+namespace Calamares
+{
class UIDLLEXPORT PythonJobModule : public Module
{
diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp
index b667b6a81..9d0aa95e2 100644
--- a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp
+++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp
@@ -40,7 +40,8 @@
static QPointer< GlobalStorage > s_gs = nullptr;
static QPointer< Utils > s_utils = nullptr;
-namespace Calamares {
+namespace Calamares
+{
Module::Type
PythonQtViewModule::type() const
@@ -98,20 +99,21 @@ PythonQtViewModule::loadSelf()
cala.addObject( "utils", s_utils );
// Append configuration object, in module PythonQt.calamares
- cala.addVariable("configuration", m_configurationMap);
+ cala.addVariable( "configuration", m_configurationMap );
// Basic stdout/stderr handling
QObject::connect( PythonQt::self(), &PythonQt::pythonStdOut,
- []( const QString& message )
- {
- cDebug() << "PythonQt OUT>" << message;
- } );
+ []( const QString& message )
+ {
+ cDebug() << "PythonQt OUT>" << message;
+ }
+ );
QObject::connect( PythonQt::self(), &PythonQt::pythonStdErr,
- []( const QString& message )
- {
- cDebug() << "PythonQt ERR>" << message;
- } );
-
+ []( const QString& message )
+ {
+ cDebug() << "PythonQt ERR>" << message;
+ }
+ );
}
QDir workingDir( m_workingPath );
@@ -137,8 +139,8 @@ PythonQtViewModule::loadSelf()
// Construct empty Python module with the given name
PythonQtObjectPtr cxt =
- PythonQt::self()->
- createModuleFromScript( name() );
+ PythonQt::self()->
+ createModuleFromScript( name() );
if ( cxt.isNull() )
{
cDebug() << "Cannot load PythonQt context from file"
@@ -149,11 +151,11 @@ PythonQtViewModule::loadSelf()
}
static const QLatin1Literal calamares_module_annotation(
- "_calamares_module_typename = ''\n"
- "def calamares_module(viewmodule_type):\n"
- " global _calamares_module_typename\n"
- " _calamares_module_typename = viewmodule_type.__name__\n"
- " return viewmodule_type\n");
+ "_calamares_module_typename = ''\n"
+ "def calamares_module(viewmodule_type):\n"
+ " global _calamares_module_typename\n"
+ " _calamares_module_typename = viewmodule_type.__name__\n"
+ " return viewmodule_type\n" );
// Load in the decorator
PythonQt::self()->evalScript( cxt, calamares_module_annotation );
@@ -191,9 +193,7 @@ PythonQtViewModule::initFrom( const QVariantMap& moduleDescriptor )
m_workingPath = directory.absolutePath();
if ( !moduleDescriptor.value( "script" ).toString().isEmpty() )
- {
m_scriptFileName = moduleDescriptor.value( "script" ).toString();
- }
}
PythonQtViewModule::PythonQtViewModule()
diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.h b/src/libcalamaresui/modulesystem/PythonQtViewModule.h
index 327e24269..cc6899599 100644
--- a/src/libcalamaresui/modulesystem/PythonQtViewModule.h
+++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.h
@@ -22,7 +22,8 @@
#include "UiDllMacro.h"
#include "Module.h"
-namespace Calamares {
+namespace Calamares
+{
class ViewStep;
diff --git a/src/libcalamaresui/modulesystem/ViewModule.cpp b/src/libcalamaresui/modulesystem/ViewModule.cpp
index 492d58fda..473ec6457 100644
--- a/src/libcalamaresui/modulesystem/ViewModule.cpp
+++ b/src/libcalamaresui/modulesystem/ViewModule.cpp
@@ -27,7 +27,8 @@
#include
#include
-namespace Calamares {
+namespace Calamares
+{
Module::Type
diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf
index cd021de29..f5fcf19c8 100644
--- a/src/modules/bootloader/bootloader.conf
+++ b/src/modules/bootloader/bootloader.conf
@@ -21,12 +21,14 @@ fallbackKernelLine: ", with _manjaro_kernel_ (fallback initramfs)"
# GRUB 2 binary names and boot directory
# Some distributions (e.g. Fedora) use grub2-* (resp. /boot/grub2/) names.
# These names are also used when using sb-shim, since that needs some
-# GRUB functionality (notably grub-probe) to work.
+# GRUB functionality (notably grub-probe) to work. As needed, you may use
+# complete paths like `/usr/bin/efibootmgr` for the executables.
#
grubInstall: "grub-install"
grubMkconfig: "grub-mkconfig"
grubCfg: "/boot/grub/grub.cfg"
-grubProbe: "/usr/sbin/grub2-probe"
+grubProbe: "grub-probe"
+efiBootMgr: "efibootmgr"
# Optionally set the bootloader ID to use for EFI. This is passed to
# grub-install --bootloader-id.
diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py
index 1abee68f7..dec0bda4b 100644
--- a/src/modules/bootloader/main.py
+++ b/src/modules/bootloader/main.py
@@ -8,7 +8,7 @@
# Copyright 2014, Daniel Hillenbrand
# Copyright 2014, Benjamin Vaudour
# Copyright 2014, Kevin Kofler
-# Copyright 2015-2017, Philip Mueller
+# Copyright 2015-2018, Philip Mueller
# Copyright 2016-2017, Teo Mrnjavac
# Copyright 2017, Alf Gaida
# Copyright 2017-2018, Adriaan de Groot
@@ -351,7 +351,7 @@ def install_secureboot(efi_directory):
raise ValueError("No partition number found for %s" % install_efi_directory)
subprocess.call([
- "/usr/sbin/efibootmgr",
+ libcalamares.job.configuration["efiBootMgr"],
"-c",
"-w",
"-L", efi_bootloader_id,
diff --git a/src/modules/dummypythonqt/lang/dummypythonqt.pot b/src/modules/dummypythonqt/lang/dummypythonqt.pot
index 1fc28e16d..2cac1d0c0 100644
--- a/src/modules/dummypythonqt/lang/dummypythonqt.pot
+++ b/src/modules/dummypythonqt/lang/dummypythonqt.pot
@@ -2,41 +2,41 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
-#
+#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-02-07 18:58+0100\n"
+"POT-Creation-Date: 2018-06-18 07:46-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
#: src/modules/dummypythonqt/main.py:84
msgid "Click me!"
-msgstr "Click me!"
+msgstr ""
#: src/modules/dummypythonqt/main.py:94
msgid "A new QLabel."
-msgstr "A new QLabel."
+msgstr ""
#: src/modules/dummypythonqt/main.py:97
msgid "Dummy PythonQt ViewStep"
-msgstr "Dummy PythonQt ViewStep"
+msgstr ""
#: src/modules/dummypythonqt/main.py:183
msgid "The Dummy PythonQt Job"
-msgstr "The Dummy PythonQt Job"
+msgstr ""
#: src/modules/dummypythonqt/main.py:186
msgid "This is the Dummy PythonQt Job. The dummy job says: {}"
-msgstr "This is the Dummy PythonQt Job. The dummy job says: {}"
+msgstr ""
#: src/modules/dummypythonqt/main.py:190
msgid "A status message for Dummy PythonQt Job."
-msgstr "A status message for Dummy PythonQt Job."
+msgstr ""
diff --git a/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.mo
index a294004cb..a7249ce6f 100644
Binary files a/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.mo differ
diff --git a/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.po
index 282fcc35d..21d6fc7b1 100644
--- a/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.po
+++ b/src/modules/dummypythonqt/lang/hi/LC_MESSAGES/dummypythonqt.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-04-13 10:28-0400\n"
+"POT-Creation-Date: 2018-05-28 04:57-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Panwar108 , 2018\n"
"Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/)\n"
@@ -28,16 +28,16 @@ msgstr "नया QLabel।"
#: src/modules/dummypythonqt/main.py:97
msgid "Dummy PythonQt ViewStep"
-msgstr "Dummy PythonQt ViewStep"
+msgstr "डमी पाइथन प्रक्रिया की चरण संख्या देखें"
#: src/modules/dummypythonqt/main.py:183
msgid "The Dummy PythonQt Job"
-msgstr "The Dummy PythonQt Job"
+msgstr "डमी पाइथन प्रक्रिया"
#: src/modules/dummypythonqt/main.py:186
msgid "This is the Dummy PythonQt Job. The dummy job says: {}"
-msgstr "यह Dummy PythonQt Job है।The dummy job says: {}"
+msgstr "यह डमी पाइथन प्रक्रिया है। डमी प्रक्रिया संबंधी संदेश : {}"
#: src/modules/dummypythonqt/main.py:190
msgid "A status message for Dummy PythonQt Job."
-msgstr "Dummy PythonQt Job के लिए एक status संदेश।"
+msgstr "डमी पाइथन प्रक्रिया की अवस्था संबंधी संदेश।"
diff --git a/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo
index 9dfa007bd..c4dfacd92 100644
Binary files a/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo differ
diff --git a/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.po
index 94b78e28a..aa8ea2265 100644
--- a/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.po
+++ b/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.po
@@ -10,6 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-28 04:57-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Ji-Hyeon Gim , 2018\n"
"Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,24 +20,24 @@ msgstr ""
#: src/modules/dummypythonqt/main.py:84
msgid "Click me!"
-msgstr ""
+msgstr "여기를 클릭하세요!"
#: src/modules/dummypythonqt/main.py:94
msgid "A new QLabel."
-msgstr ""
+msgstr "새로운 QLabel."
#: src/modules/dummypythonqt/main.py:97
msgid "Dummy PythonQt ViewStep"
-msgstr ""
+msgstr "더미 PythonQt ViewStep"
#: src/modules/dummypythonqt/main.py:183
msgid "The Dummy PythonQt Job"
-msgstr ""
+msgstr "더미 PythonQt Job"
#: src/modules/dummypythonqt/main.py:186
msgid "This is the Dummy PythonQt Job. The dummy job says: {}"
-msgstr ""
+msgstr "더미 PythonQt Job입니다. 이 더미 Job의 출력은 다음과 같습니다: {}"
#: src/modules/dummypythonqt/main.py:190
msgid "A status message for Dummy PythonQt Job."
-msgstr ""
+msgstr "더미 PythonQt Job의 상태 메시지"
diff --git a/src/modules/localecfg/main.py b/src/modules/localecfg/main.py
index d44d7da2b..62a00b738 100644
--- a/src/modules/localecfg/main.py
+++ b/src/modules/localecfg/main.py
@@ -7,6 +7,7 @@
# Copyright 2015, Philip Müller
# Copyright 2016, Teo Mrnjavac
# Copyright 2018, AlmAck
+# Copyright 2018, Adriaan de Groot
#
# Calamares is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -22,14 +23,91 @@
# along with Calamares. If not, see .
import os
+import re
import shutil
-import libcalamares
+RE_IS_COMMENT = re.compile("^ *#")
+def is_comment(line):
+ """
+ Does the @p line look like a comment? Whitespace, followed by a #
+ is a comment-only line.
+ """
+ return bool(RE_IS_COMMENT.match(line))
+
+RE_TRAILING_COMMENT = re.compile("#.*$")
+RE_REST_OF_LINE = re.compile("\\s.*$")
+def extract_locale(line):
+ """
+ Extracts a locale from the @p line, and returns a pair of
+ (extracted-locale, uncommented line). The locale is the
+ first word of the line after uncommenting (in the human-
+ readable text explanation at the top of most /etc/locale.gen
+ files, the locales may be bogus -- either "" or e.g. "Configuration")
+ """
+ # Remove leading spaces and comment signs
+ line = RE_IS_COMMENT.sub("", line)
+ uncommented = line.strip()
+ fields = RE_TRAILING_COMMENT.sub("", uncommented).strip().split()
+ if len(fields) != 2:
+ # Not exactly two fields, can't be a proper locale line
+ return "", uncommented
+ else:
+ # Drop all but first field
+ locale = RE_REST_OF_LINE.sub("", uncommented)
+ return locale, uncommented
+
+
+def rewrite_locale_gen(srcfilename, destfilename, locale_conf):
+ """
+ Copies a locale.gen file from @p srcfilename to @p destfilename
+ (this may be the same name), enabling those locales that can
+ be found in the map @p locale_conf. Also always enables en_US.UTF-8.
+ """
+ en_us_locale = 'en_US.UTF-8'
+
+ # Get entire source-file contents
+ text = []
+ with open(srcfilename, "r") as gen:
+ text = gen.readlines()
+
+ # we want unique values, so locale_values should have 1 or 2 items
+ locale_values = set(locale_conf.values())
+ locale_values.add(en_us_locale) # Always enable en_US as well
+
+ enabled_locales = {}
+ seen_locales = set()
+
+ # Write source out again, enabling some
+ with open(destfilename, "w") as gen:
+ for line in text:
+ c = is_comment(line)
+ locale, uncommented = extract_locale(line)
+
+ # Non-comment lines are preserved, and comment lines
+ # may be enabled if they match a desired locale
+ if not c:
+ seen_locales.add(locale)
+ else:
+ for locale_value in locale_values:
+ if locale.startswith(locale_value):
+ enabled_locales[locale] = uncommented
+ gen.write(line)
+
+ gen.write("\n###\n#\n# Locales enabled by Calamares\n")
+ for locale, line in enabled_locales.items():
+ if locale not in seen_locales:
+ gen.write(line + "\n")
+ seen_locales.add(locale)
+
+ for locale in locale_values:
+ if locale not in seen_locales:
+ gen.write("# Missing: %s\n" % locale)
def run():
""" Create locale """
- en_us_locale = 'en_US.UTF-8'
+ import libcalamares
+
locale_conf = libcalamares.globalstorage.value("localeConf")
if not locale_conf:
@@ -47,50 +125,36 @@ def run():
}
install_path = libcalamares.globalstorage.value("rootMountPoint")
+ target_locale_gen = "{!s}/etc/locale.gen".format(install_path)
+ target_locale_gen_bak = target_locale_gen + ".bak"
+ target_locale_conf_path = "{!s}/etc/locale.conf".format(install_path)
+ target_etc_default_path = "{!s}/etc/default".format(install_path)
# restore backup if available
- if os.path.exists('/etc/locale.gen.bak'):
- shutil.copy2("{!s}/etc/locale.gen.bak".format(install_path),
- "{!s}/etc/locale.gen".format(install_path))
+ if os.path.exists(target_locale_gen_bak):
+ shutil.copy2(target_locale_gen_bak, target_locale_gen)
+ libcalamares.utils.debug("Restored backup {!s} -> {!s}"
+ .format(target_locale_gen_bak).format(target_locale_gen))
- # run locale-gen if detected
+ # run locale-gen if detected; this *will* cause an exception
+ # if the live system has locale.gen, but the target does not:
+ # in that case, fix your installation filesystem.
if os.path.exists('/etc/locale.gen'):
- text = []
-
- with open("{!s}/etc/locale.gen".format(install_path), "r") as gen:
- text = gen.readlines()
-
- # we want unique values, so locale_values should have 1 or 2 items
- locale_values = set(locale_conf.values())
-
- with open("{!s}/etc/locale.gen".format(install_path), "w") as gen:
- for line in text:
- # always enable en_US
- if line.startswith("#" + en_us_locale):
- # uncomment line
- line = line[1:].lstrip()
-
- for locale_value in locale_values:
- if line.startswith("#" + locale_value):
- # uncomment line
- line = line[1:].lstrip()
-
- gen.write(line)
-
+ rewrite_locale_gen(target_locale_gen, target_locale_gen, locale_conf)
libcalamares.utils.target_env_call(['locale-gen'])
- print('locale.gen done')
+ libcalamares.utils.debug('{!s} done'.format(target_locale_gen))
# write /etc/locale.conf
- locale_conf_path = os.path.join(install_path, "etc/locale.conf")
- with open(locale_conf_path, "w") as lcf:
+ with open(target_locale_conf_path, "w") as lcf:
for k, v in locale_conf.items():
lcf.write("{!s}={!s}\n".format(k, v))
+ libcalamares.utils.debug('{!s} done'.format(target_locale_conf_path))
# write /etc/default/locale if /etc/default exists and is a dir
- etc_default_path = os.path.join(install_path, "etc/default")
- if os.path.isdir(etc_default_path):
- with open(os.path.join(etc_default_path, "locale"), "w") as edl:
+ if os.path.isdir(target_etc_default_path):
+ with open(os.path.join(target_etc_default_path, "locale"), "w") as edl:
for k, v in locale_conf.items():
edl.write("{!s}={!s}\n".format(k, v))
+ libcalamares.utils.debug('{!s} done'.format(target_etc_default_path))
return None
diff --git a/src/modules/localecfg/module.desc b/src/modules/localecfg/module.desc
index 89baab7ad..815480562 100644
--- a/src/modules/localecfg/module.desc
+++ b/src/modules/localecfg/module.desc
@@ -1,3 +1,6 @@
+# Enable the configured locales (those set by the user on the
+# user page) in /etc/locale.gen, if they are available in the
+# target system.
---
type: "job"
name: "localecfg"
diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py
index d9741287b..bffd6a945 100644
--- a/src/modules/packages/main.py
+++ b/src/modules/packages/main.py
@@ -8,6 +8,7 @@
# Copyright 2016-2017, Kyle Robbertze
# Copyright 2017, Alf Gaida
# Copyright 2018, Adriaan de Groot
+# Copyright 2018, Philip Müller
#
# Calamares is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -153,6 +154,8 @@ class PMPackageKit(PackageManager):
def update_db(self):
check_target_env_call(["pkcon", "refresh"])
+ def update_system(self):
+ check_target_env_call(["pkcon", "-py", "update"])
class PMZypp(PackageManager):
backend = "zypp"
@@ -170,12 +173,15 @@ class PMZypp(PackageManager):
def update_db(self):
check_target_env_call(["zypper", "--non-interactive", "update"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
class PMYum(PackageManager):
backend = "yum"
def install(self, pkgs, from_local=False):
- check_target_env_call(["yum", "install", "-y"] + pkgs)
+ check_target_env_call(["yum", "-y", "install"] + pkgs)
def remove(self, pkgs):
check_target_env_call(["yum", "--disablerepo=*", "-C", "-y",
@@ -185,12 +191,14 @@ class PMYum(PackageManager):
# Doesn't need updates
pass
+ def update_system(self):
+ check_target_env_call(["yum", "-y", "upgrade"])
class PMDnf(PackageManager):
backend = "dnf"
def install(self, pkgs, from_local=False):
- check_target_env_call(["dnf", "install", "-y"] + pkgs)
+ check_target_env_call(["dnf", "-y", "install"] + pkgs)
def remove(self, pkgs):
# ignore the error code for now because dnf thinks removing a
@@ -199,9 +207,12 @@ class PMDnf(PackageManager):
"remove"] + pkgs)
def update_db(self):
- # Doesn't need to update explicitly
+ # Doesn't need updates
pass
+ def update_system(self):
+ check_target_env_call(["dnf", "-y", "upgrade"])
+
class PMUrpmi(PackageManager):
backend = "urpmi"
@@ -218,6 +229,10 @@ class PMUrpmi(PackageManager):
def update_db(self):
check_target_env_call(["urpmi.update", "-a"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
+
class PMApt(PackageManager):
backend = "apt"
@@ -234,6 +249,10 @@ class PMApt(PackageManager):
def update_db(self):
check_target_env_call(["apt-get", "update"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
+
class PMPacman(PackageManager):
backend = "pacman"
@@ -242,7 +261,7 @@ class PMPacman(PackageManager):
if from_local:
pacman_flags = "-U"
else:
- pacman_flags = "-Sy"
+ pacman_flags = "-S"
check_target_env_call(["pacman", pacman_flags,
"--noconfirm"] + pkgs)
@@ -253,6 +272,9 @@ class PMPacman(PackageManager):
def update_db(self):
check_target_env_call(["pacman", "-Sy"])
+ def update_system(self):
+ check_target_env_call(["pacman", "-Su"])
+
class PMPortage(PackageManager):
backend = "portage"
@@ -267,6 +289,10 @@ class PMPortage(PackageManager):
def update_db(self):
check_target_env_call(["emerge", "--sync"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
+
class PMEntropy(PackageManager):
backend = "entropy"
@@ -280,6 +306,10 @@ class PMEntropy(PackageManager):
def update_db(self):
check_target_env_call(["equo", "update"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
+
class PMDummy(PackageManager):
backend = "dummy"
@@ -293,6 +323,9 @@ class PMDummy(PackageManager):
def update_db(self):
libcalamares.utils.debug("Updating DB")
+ def update_system(self):
+ libcalamares.utils.debug("Updating System")
+
def run(self, script):
libcalamares.utils.debug("Running script '" + str(script) + "'")
@@ -309,6 +342,10 @@ class PMPisi(PackageManager):
def update_db(self):
check_target_env_call(["pisi", "update-repo"])
+ def update_system(self):
+ # Doesn't need to update the system explicitly
+ pass
+
# Collect all the subclasses of PackageManager defined above,
# and index them based on the backend property of each class.
@@ -452,6 +489,10 @@ def run():
if update_db and libcalamares.globalstorage.value("hasInternet"):
pkgman.update_db()
+ update_system = libcalamares.job.configuration.get("update_system", False)
+ if update_system and libcalamares.globalstorage.value("hasInternet"):
+ pkgman.update_system()
+
operations = libcalamares.job.configuration.get("operations", [])
if libcalamares.globalstorage.contains("packageOperations"):
operations += libcalamares.globalstorage.value("packageOperations")
diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf
index ae141ee3a..974ba07a7 100644
--- a/src/modules/packages/packages.conf
+++ b/src/modules/packages/packages.conf
@@ -14,21 +14,30 @@
#
backend: dummy
+#
# Often package installation needs an internet connection.
# Since you may allow system installation without a connection
-# and want to offer **optional** package installation, it's
+# and want to offer OPTIONAL package installation, it's
# possible to have no internet, yet have this packages module
# enabled in settings.
#
# You can skip the whole module when there is no internet
-# by setting *skip_if_no_internet* to true.
+# by setting "skip_if_no_internet" to true.
#
# You can run a package-manager specific update procedure
# before installing packages (for instance, to update the
# list of packages and dependencies); this is done only if there
-# is an internet connection. Set *update_db* to true to do so.
+# is an internet connection.
+#
+# Set "update_db" to 'true' for refreshing the database on the
+# target system. On target installations, which got installed by
+# unsquashing, a full system update may be needed. Otherwise
+# post-installing additional packages may result in conflicts.
+# Therefore set also "update_system" to 'true'.
+#
skip_if_no_internet: false
update_db: true
+update_system: false
#
# List of maps with package operations such as install or remove.
@@ -86,14 +95,14 @@ update_db: true
#
# - if the system locale is English (any variety), then the package is not
# installed at all,
-# - otherwise $LOCALE or ${LOCALE} is replaced by the **lower-cased** BCP47
-# name of the **language** part of the selected system locale (not the
-# country/region/dialect part), e.g. selecting *nl_BE* will use *nl*
+# - otherwise $LOCALE or ${LOCALE} is replaced by the 'lower-cased' BCP47
+# name of the 'language' part of the selected system locale (not the
+# country/region/dialect part), e.g. selecting "nl_BE" will use "nl"
# here.
#
# Take care that just plain LOCALE will not be replaced, so foo-LOCALE will
# be left unchanged, while foo-$LOCALE will be changed. However, foo-LOCALE
-# **will** be removed from the list of packages, if English is selected.
+# 'will' be removed from the list of packages, if English is selected.
#
# The following installs localizations for vi, if they are relevant; if
# there is no localization, installation continues normally.
diff --git a/src/modules/partition/gui/PartitionPage.ui b/src/modules/partition/gui/PartitionPage.ui
index 7d24204c9..67ac4fb2d 100644
--- a/src/modules/partition/gui/PartitionPage.ui
+++ b/src/modules/partition/gui/PartitionPage.ui
@@ -104,7 +104,7 @@
- &Create
+ Cre&ate