1
0
mirror of https://github.com/systemd/systemd synced 2026-03-15 09:34:47 +01:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Zbigniew Jędrzejewski-Szmek
a2031de849 tools/make-directive-index: parallelize
I occasionally do 'build/man/man systemd.directives' when working on man pages,
and it's annoying slow. By paralellizing the parsing of xml, we can make it a
bit faster.

This is still rather innefficient. Only the parsing part is serialized, xml is
still produced serially at the end, which is hard to avoid.

$ ninja -C build man/systemd.directives.xml
before:
8.20s user 0.21s system 99% cpu 8.460 total
8.33s user 0.18s system 98% cpu 8.619 total
8.72s user 0.19s system 98% cpu 9.019 total

after:
13.99s user 0.73s system 345% cpu 4.262 total
14.15s user 0.35s system 348% cpu 4.161 total
14.33s user 0.35s system 339% cpu 4.321 total

I.e. it uses almost twice as much cpu, but cuts the wallclock time down (on a
2-core/4-thread cpu) to about half too, which is an overall win if you're just
trying to render the man page.

The change from list and .append() to set and .add() is something that could
have been done before too, but it's noticable now. It cuts down on the
serialization/deserialization time (about .2s).
2021-05-13 11:53:01 +02:00
Simon Watts
31b5be17e0 Add Microsoft Pro Intellimouse MOUSE_DPI to hwdb
- Internet specifications give 1600 DPI @ 1000Hz for this sensor
- Confirmed experimentally via `mouse-dpi-tool`
- vid, pid, and name match string from `mouse-dpi-tool`
2021-05-13 11:21:27 +02:00
Seong-ho Cho
6c041ce387
Update Korean translation (#19083)
Co-authored-by: Seong-ho Cho <shcho@gnome.org>
2021-05-13 10:19:48 +02:00
3 changed files with 95 additions and 70 deletions

View File

@ -666,6 +666,10 @@ mouse:bluetooth:v0000p0000:name:Surface Mouse:*
mouse:usb:v045ep0823:name:Microsoft Microsoft?? Classic IntelliMouse??:* mouse:usb:v045ep0823:name:Microsoft Microsoft?? Classic IntelliMouse??:*
MOUSE_DPI=3200@1000 MOUSE_DPI=3200@1000
# Microsoft Pro Intellimouse
mouse:usb:v045ep082a:name:Microsoft Microsoft Pro Intellimouse Mouse:*
MOUSE_DPI=1600@1000
########################################## ##########################################
# Mionix # Mionix
########################################## ##########################################

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later # SPDX-License-Identifier: LGPL-2.1-or-later
# #
# Korean translation for the systemd. # Korean translation for the systemd.
# Seong-ho Cho <shcho@gnome.org>, 2015. # Seong-ho Cho <shcho@gnome.org>, 2015, 2021.
# Dongsu Park <dongsu@endocode.com>, 2015. # Dongsu Park <dongsu@endocode.com>, 2015.
# simmon <simmon@nplob.com>, 2021. # simmon <simmon@nplob.com>, 2021.
msgid "" msgid ""
@ -70,7 +70,7 @@ msgstr "홈 영역 생성"
#: src/home/org.freedesktop.home1.policy:14 #: src/home/org.freedesktop.home1.policy:14
msgid "Authentication is required to create a user's home area." msgid "Authentication is required to create a user's home area."
msgstr "사용자 홈 영역을 생성하기 위해서는 인증이 필요합니다." msgstr "사용자 홈 영역을 만들려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:23 #: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area" msgid "Remove a home area"
@ -78,16 +78,16 @@ msgstr "홈 영역 제거"
#: src/home/org.freedesktop.home1.policy:24 #: src/home/org.freedesktop.home1.policy:24
msgid "Authentication is required to remove a user's home area." msgid "Authentication is required to remove a user's home area."
msgstr "사용자 홈 영역을 제거하기 위해서는 인증이 필요합니다." msgstr "사용자 홈 영역을 제거하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:33 #: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area" msgid "Check credentials of a home area"
msgstr "홈영역 자격증명 확인" msgstr "홈 영역 자격증명 확인"
#: src/home/org.freedesktop.home1.policy:34 #: src/home/org.freedesktop.home1.policy:34
msgid "" msgid ""
"Authentication is required to check credentials against a user's home area." "Authentication is required to check credentials against a user's home area."
msgstr "사용자 홈 영역의 자격증명 확인하려면 인증이 필요합니다." msgstr "사용자 홈 영역의 자격 증명 확인하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:43 #: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area" msgid "Update a home area"
@ -99,20 +99,20 @@ msgstr "사용자 홈 영역을 최신화 하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:53 #: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area" msgid "Resize a home area"
msgstr "홈 영역을 조" msgstr "홈 영역을 조"
#: src/home/org.freedesktop.home1.policy:54 #: src/home/org.freedesktop.home1.policy:54
msgid "Authentication is required to resize a user's home area." msgid "Authentication is required to resize a user's home area."
msgstr "사용자 홈 영역의 크기를 조절하려면 인증이 필요합니다." msgstr "사용자 홈 영역을 조정하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:63 #: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area" msgid "Change password of a home area"
msgstr "홈 영역의 비밀번호를 변경" msgstr "홈 영역 암호 변경"
#: src/home/org.freedesktop.home1.policy:64 #: src/home/org.freedesktop.home1.policy:64
msgid "" msgid ""
"Authentication is required to change the password of a user's home area." "Authentication is required to change the password of a user's home area."
msgstr "사용자 홈 영역의 비밀번호를 변경하려면 비밀번호가 필요합니다." msgstr "사용자 홈 영역의 암호를 바꾸려면 인증이 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:20 #: src/hostname/org.freedesktop.hostname1.policy:20
msgid "Set hostname" msgid "Set hostname"
@ -130,7 +130,7 @@ msgstr "정적 호스트 이름 설정"
msgid "" msgid ""
"Authentication is required to set the statically configured local hostname, " "Authentication is required to set the statically configured local hostname, "
"as well as the pretty hostname." "as well as the pretty hostname."
msgstr "로컬호스트 이름을 지정 호스트이름 처럼 정적으로 설정하려면 인증이 필요합니다." msgstr "로컬 호스트 이름을 지정 호스트 이름처럼 정적으로 설정하려면 인증이 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:41 #: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information" msgid "Set machine information"
@ -142,11 +142,11 @@ msgstr "로컬 머신 정보를 설정하려면 인증이 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:51 #: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID" msgid "Get product UUID"
msgstr "제품 UUID를 획득" msgstr "제품 UUID 가져오기"
#: src/hostname/org.freedesktop.hostname1.policy:52 #: src/hostname/org.freedesktop.hostname1.policy:52
msgid "Authentication is required to get product UUID." msgid "Authentication is required to get product UUID."
msgstr "제품 UUID를 얻기 위해서는 인증이 필요합니다." msgstr "제품 UUID를 가져오려면 인증이 필요합니다."
#: src/import/org.freedesktop.import1.policy:22 #: src/import/org.freedesktop.import1.policy:22
msgid "Import a VM or container image" msgid "Import a VM or container image"
@ -166,11 +166,11 @@ msgstr "가상 머신 또는 컨테이너의 이미지를 내보내려면 인증
#: src/import/org.freedesktop.import1.policy:42 #: src/import/org.freedesktop.import1.policy:42
msgid "Download a VM or container image" msgid "Download a VM or container image"
msgstr "가상머신 또는 컨테이너 이미지 내려받기" msgstr "가상 머신 또는 컨테이너 이미지 다운로드"
#: src/import/org.freedesktop.import1.policy:43 #: src/import/org.freedesktop.import1.policy:43
msgid "Authentication is required to download a VM or container image" msgid "Authentication is required to download a VM or container image"
msgstr "가상머신 또는 컨테이너 이미지를 내려받기하려면 인증이 필요합니다" msgstr "가상 머신 또는 컨테이너 이미지를 다운로드하려면 인증이 필요합니다"
#: src/locale/org.freedesktop.locale1.policy:22 #: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale" msgid "Set system locale"
@ -282,13 +282,13 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:117 #: src/login/org.freedesktop.login1.policy:117
msgid "Allow applications to inhibit system handling of the reboot key" msgid "Allow applications to inhibit system handling of the reboot key"
msgstr "응용프로그램이 리부트 키 처리하는 시스템 방지 허용" msgstr "프로그램의 재부팅 키 시스템 동작 방지 허용"
#: src/login/org.freedesktop.login1.policy:118 #: src/login/org.freedesktop.login1.policy:118
msgid "" msgid ""
"Authentication is required for an application to inhibit system handling of " "Authentication is required for an application to inhibit system handling of "
"the reboot key." "the reboot key."
msgstr "응용프로그램이 시스템 리부트 키 처리 방지 요청을 허용하려면 인증이 필요합니다." msgstr "프로그램의 재부팅 키 시스템 동작 방지를 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:128 #: src/login/org.freedesktop.login1.policy:128
msgid "Allow non-logged-in user to run programs" msgid "Allow non-logged-in user to run programs"
@ -399,17 +399,19 @@ msgstr "다른 사용자가 로그인 했을 때 시스템이 정지 상태진
msgid "" msgid ""
"Authentication is required to halt the system while other users are logged " "Authentication is required to halt the system while other users are logged "
"in." "in."
msgstr "다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다." msgstr ""
"다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:257 #: src/login/org.freedesktop.login1.policy:257
msgid "Halt the system while an application is inhibiting this" msgid "Halt the system while an application is inhibiting this"
msgstr "응용프로그램이 이와 같이 금지 상태일 때에 시스템 정지 상태 진입" msgstr "프로그램에서 전원 끄기를 막을 때 시스템 전원 끄기"
#: src/login/org.freedesktop.login1.policy:258 #: src/login/org.freedesktop.login1.policy:258
msgid "" msgid ""
"Authentication is required to halt the system while an application is " "Authentication is required to halt the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "응용프로그램이 이와 같이 금지 할 때에는 시스템을 정지 할 때에는인증이 필요합니다." msgstr ""
"프로그램에서 전원 끄기를 막을 때 시스템 전원을 끄려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:268 #: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system" msgid "Suspend the system"
@ -432,15 +434,15 @@ msgstr ""
#: src/login/org.freedesktop.login1.policy:289 #: src/login/org.freedesktop.login1.policy:289
msgid "Suspend the system while an application is inhibiting this" msgid "Suspend the system while an application is inhibiting this"
msgstr "프로그램이 절전 상태 진입을 못하게 요청할 때 시스템 절전 상태 진입" msgstr "프로그램에서 대기 모드 진입을 막을 때 시스템 대기 상태 진입"
#: src/login/org.freedesktop.login1.policy:290 #: src/login/org.freedesktop.login1.policy:290
msgid "" msgid ""
"Authentication is required to suspend the system while an application is " "Authentication is required to suspend the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"프로그램이 절전 상태 진입을 못하게 요청할 때 시스템을 절전 상태로 놓으려면 인" "프로그램에서 대기 모드 진입을 막을 때 시스템을 대기 상태로 설정하려면 인증이 "
"증이 필요합니다." "필요합니다."
#: src/login/org.freedesktop.login1.policy:300 #: src/login/org.freedesktop.login1.policy:300
msgid "Hibernate the system" msgid "Hibernate the system"
@ -459,21 +461,21 @@ msgid ""
"Authentication is required to hibernate the system while other users are " "Authentication is required to hibernate the system while other users are "
"logged in." "logged in."
msgstr "" msgstr ""
"다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 놓으려면 인증이 필요합" "다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 설정하려면 인증이 필요"
"니다." "니다."
#: src/login/org.freedesktop.login1.policy:321 #: src/login/org.freedesktop.login1.policy:321
msgid "Hibernate the system while an application is inhibiting this" msgid "Hibernate the system while an application is inhibiting this"
msgstr "" msgstr ""
"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템 최대 절전 상태 진입" "프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템 최대 절전 상태 진입"
#: src/login/org.freedesktop.login1.policy:322 #: src/login/org.freedesktop.login1.policy:322
msgid "" msgid ""
"Authentication is required to hibernate the system while an application is " "Authentication is required to hibernate the system while an application is "
"inhibiting this." "inhibiting this."
msgstr "" msgstr ""
"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템을 최대 절전 상태로 " "프로그램에서 최대 절전 모드로의 진입을 막을 때 시스템을 최대 절전 상태로 설정"
"놓으려면 인증이 필요합니다." "려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:332 #: src/login/org.freedesktop.login1.policy:332
msgid "Manage active sessions, users and seats" msgid "Manage active sessions, users and seats"
@ -493,11 +495,11 @@ msgstr "활성화 세션을 잠금 또는 잠금 해제하려면 인증이 필
#: src/login/org.freedesktop.login1.policy:352 #: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel" msgid "Set the reboot \"reason\" in the kernel"
msgstr "커널이 재시작 \"원인\"을 설정합니다" msgstr "커널에서 재시작 \"사유\" 설정"
#: src/login/org.freedesktop.login1.policy:353 #: src/login/org.freedesktop.login1.policy:353
msgid "Authentication is required to set the reboot \"reason\" in the kernel." msgid "Authentication is required to set the reboot \"reason\" in the kernel."
msgstr "커널에서 \"reason\"으로 재동작 설정하려면 인증이 필요합니다." msgstr "커널에서 재시작 \"사유\"를 설정하게 하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:363 #: src/login/org.freedesktop.login1.policy:363
msgid "Indicate to the firmware to boot to setup interface" msgid "Indicate to the firmware to boot to setup interface"
@ -511,23 +513,23 @@ msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인
#: src/login/org.freedesktop.login1.policy:374 #: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu" msgid "Indicate to the boot loader to boot to the boot loader menu"
msgstr "부트로더 메뉴에 부팅하기 위해 부트로더에 표시하기" msgstr "부트로더에 부팅할 부트로더 메뉴 표시"
#: src/login/org.freedesktop.login1.policy:375 #: src/login/org.freedesktop.login1.policy:375
msgid "" msgid ""
"Authentication is required to indicate to the boot loader to boot to the " "Authentication is required to indicate to the boot loader to boot to the "
"boot loader menu." "boot loader menu."
msgstr "부트로더에 부팅하려면 부트로더 메뉴에 표시하려면 인증이 필요합니다." msgstr "부트로더 메뉴에 부팅할 부트로더를 나타내려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:385 #: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry" msgid "Indicate to the boot loader to boot a specific entry"
msgstr "특정 항목으로 재시작 하기 위해 부트로더 표시" msgstr "부팅할 특정 항목을 부트로더에 표시"
#: src/login/org.freedesktop.login1.policy:386 #: src/login/org.freedesktop.login1.policy:386
msgid "" msgid ""
"Authentication is required to indicate to the boot loader to boot into a " "Authentication is required to indicate to the boot loader to boot into a "
"specific boot loader entry." "specific boot loader entry."
msgstr "부트로더에 지정한 부트로더 에서 부트하거나 지정한 부트로더 진입을 표시하려면 인증이 필요합니다." msgstr "부팅할 특정 항목을 부트로더에 표시하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:396 #: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message" msgid "Set a wall message"
@ -535,7 +537,7 @@ msgstr "wall 메시지 설정"
#: src/login/org.freedesktop.login1.policy:397 #: src/login/org.freedesktop.login1.policy:397
msgid "Authentication is required to set a wall message" msgid "Authentication is required to set a wall message"
msgstr "wall 메시지를 설정하려면 인증이 필요합니다" msgstr "모든 사용자에게 작성할 wall 메시지를 설정하려면 인증이 필요합니다"
#: src/login/org.freedesktop.login1.policy:406 #: src/login/org.freedesktop.login1.policy:406
msgid "Change Session" msgid "Change Session"
@ -543,7 +545,7 @@ msgstr "세션 변경"
#: src/login/org.freedesktop.login1.policy:407 #: src/login/org.freedesktop.login1.policy:407
msgid "Authentication is required to change the virtual terminal." msgid "Authentication is required to change the virtual terminal."
msgstr "가상 터미널을 변경하려면 인증이 필요합니다." msgstr "가상 터미널을 바꾸려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:22 #: src/machine/org.freedesktop.machine1.policy:22
msgid "Log into a local container" msgid "Log into a local container"
@ -579,12 +581,12 @@ msgstr "로컬 호스트의 쉘을 획득하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:64 #: src/machine/org.freedesktop.machine1.policy:64
msgid "Acquire a pseudo TTY in a local container" msgid "Acquire a pseudo TTY in a local container"
msgstr "로컬 컨테이너에서 사 TTY 획득" msgstr "로컬 컨테이너에서 사 TTY 획득"
#: src/machine/org.freedesktop.machine1.policy:65 #: src/machine/org.freedesktop.machine1.policy:65
msgid "" msgid ""
"Authentication is required to acquire a pseudo TTY in a local container." "Authentication is required to acquire a pseudo TTY in a local container."
msgstr "로컬 컨테이너에서 사 TTY를 획득하려면 인증이 필요합니다." msgstr "로컬 컨테이너에서 사 TTY를 획득하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:74 #: src/machine/org.freedesktop.machine1.policy:74
msgid "Acquire a pseudo TTY on the local host" msgid "Acquire a pseudo TTY on the local host"
@ -592,7 +594,7 @@ msgstr "로컬 호스트에서 유사 TTY 획득"
#: src/machine/org.freedesktop.machine1.policy:75 #: src/machine/org.freedesktop.machine1.policy:75
msgid "Authentication is required to acquire a pseudo TTY on the local host." msgid "Authentication is required to acquire a pseudo TTY on the local host."
msgstr "로컬 호스트에서 사 TTY를 획득하려면 인증이 필요합니다." msgstr "로컬 호스트에서 사 TTY를 획득하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:84 #: src/machine/org.freedesktop.machine1.policy:84
msgid "Manage local virtual machines and containers" msgid "Manage local virtual machines and containers"
@ -719,11 +721,11 @@ msgstr "DNS 설정을 재시작하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:143 #: src/network/org.freedesktop.network1.policy:143
msgid "DHCP server sends force renew message" msgid "DHCP server sends force renew message"
msgstr "DHCP 서버는 새로운 메시지를 강제로 보냅니다" msgstr "DHCP 서버에서 새 메시지 강제 전송"
#: src/network/org.freedesktop.network1.policy:144 #: src/network/org.freedesktop.network1.policy:144
msgid "Authentication is required to send force renew message." msgid "Authentication is required to send force renew message."
msgstr "새로운 메시지를 보내려면 인증이 필요합니다." msgstr "강제로 새 메시지를 보내려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:154 #: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses" msgid "Renew dynamic addresses"
@ -731,15 +733,15 @@ msgstr "동적 주소 갱신"
#: src/network/org.freedesktop.network1.policy:155 #: src/network/org.freedesktop.network1.policy:155
msgid "Authentication is required to renew dynamic addresses." msgid "Authentication is required to renew dynamic addresses."
msgstr "동적주소를 새로 변경하려면 인증이 필요합니다." msgstr "동적 주소를 새로 바꾸려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:165 #: src/network/org.freedesktop.network1.policy:165
msgid "Reload network settings" msgid "Reload network settings"
msgstr "네트웍설정 다시 적재함" msgstr "네트워크 설정 새로 불러오기"
#: src/network/org.freedesktop.network1.policy:166 #: src/network/org.freedesktop.network1.policy:166
msgid "Authentication is required to reload network settings." msgid "Authentication is required to reload network settings."
msgstr "네트웍 설정을 재적재하려면 인증이 필요합니다." msgstr "네트워크 설정을 다시 불러오려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:176 #: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface" msgid "Reconfigure network interface"
@ -747,7 +749,7 @@ msgstr "네트워크 인터페이스 재설정"
#: src/network/org.freedesktop.network1.policy:177 #: src/network/org.freedesktop.network1.policy:177
msgid "Authentication is required to reconfigure network interface." msgid "Authentication is required to reconfigure network interface."
msgstr "네트웍 연결장치를 재설정하려면 인증이 필요합니다." msgstr "네트워크 연결 장치를 다시 설정하려면 인증이 필요합니다."
#: src/portable/org.freedesktop.portable1.policy:13 #: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image" msgid "Inspect a portable service image"
@ -871,12 +873,10 @@ msgstr "'$(unit)' 서비스 유닛 속성을 설정하려면 인증이 필요합
msgid "" msgid ""
"Authentication is required to delete files and directories associated with " "Authentication is required to delete files and directories associated with "
"'$(unit)'." "'$(unit)'."
msgstr "'$(unit)' 과 함께 지정된 파일 또는 디렉토리 삭제에는 인증이 필요합니다." msgstr ""
"'$(unit)'에 해당하는 파일 또는 디렉터리를 삭제하려면 인증이 필요합니다."
#: src/core/dbus-unit.c:757 #: src/core/dbus-unit.c:757
msgid "" msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit." "Authentication is required to freeze or thaw the processes of '$(unit)' unit."
msgstr "'$(unit)'단위의 처리를 동결 또는 해제하기 위해서는 인증이 필요합니다." msgstr "'$(unit)'단위의 처리를 동결 또는 해제하려면 인증이 필요합니다."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "'$(unit)' 서비스 유닛을 강제로 끝내려면 인증이 필요합니다."

View File

@ -4,18 +4,21 @@
import sys import sys
import collections import collections
import re import re
import concurrent.futures
from xml_helper import xml_parse, xml_print, tree from xml_helper import xml_parse, xml_print, tree
from copy import deepcopy
COLOPHON = '''\ COLOPHON = '''\
This index contains {count} entries in {sections} sections, This index contains {count} entries in {sections} sections,
referring to {pages} individual manual pages. referring to {pages} individual manual pages.
''' '''
def _extract_directives(directive_groups, formatting, page): def _extract_directives(page, names):
directive_groups = {name:collections.defaultdict(set) for name in names}
t = xml_parse(page) t = xml_parse(page)
section = t.find('./refmeta/manvolnum').text section = t.find('./refmeta/manvolnum').text
pagename = t.find('./refmeta/refentrytitle').text pagename = t.find('./refmeta/refentrytitle').text
formatting = {}
storopt = directive_groups['options'] storopt = directive_groups['options']
for variablelist in t.iterfind('.//variablelist'): for variablelist in t.iterfind('.//variablelist'):
@ -31,7 +34,7 @@ def _extract_directives(directive_groups, formatting, page):
if text.startswith('-'): if text.startswith('-'):
# for options, merge options with and without mandatory arg # for options, merge options with and without mandatory arg
text = text.partition('=')[0] text = text.partition('=')[0]
stor[text].append((pagename, section)) stor[text].add((pagename, section))
if text not in formatting: if text not in formatting:
# use element as formatted display # use element as formatted display
if name.text[-1] in "= '": if name.text[-1] in "= '":
@ -42,7 +45,7 @@ def _extract_directives(directive_groups, formatting, page):
formatting[text] = name formatting[text] = name
extra = variablelist.attrib.get('extra-ref') extra = variablelist.attrib.get('extra-ref')
if extra: if extra:
stor[extra].append((pagename, section)) stor[extra].add((pagename, section))
if extra not in formatting: if extra not in formatting:
elt = tree.Element("varname") elt = tree.Element("varname")
elt.text= extra elt.text= extra
@ -68,13 +71,13 @@ def _extract_directives(directive_groups, formatting, page):
name.text = text name.text = text
if text.endswith('/'): if text.endswith('/'):
text = text[:-1] text = text[:-1]
storfile[text].append((pagename, section)) storfile[text].add((pagename, section))
if text not in formatting: if text not in formatting:
# use element as formatted display # use element as formatted display
formatting[text] = name formatting[text] = name
else: else:
text = ' '.join(name.itertext()) text = ' '.join(name.itertext())
storfile[text].append((pagename, section)) storfile[text].add((pagename, section))
formatting[text] = name formatting[text] = name
storfile = directive_groups['constants'] storfile = directive_groups['constants']
@ -84,7 +87,7 @@ def _extract_directives(directive_groups, formatting, page):
name.tail = '' name.tail = ''
if name.text.startswith('('): # a cast, strip it if name.text.startswith('('): # a cast, strip it
name.text = name.text.partition(' ')[2] name.text = name.text.partition(' ')[2]
storfile[name.text].append((pagename, section)) storfile[name.text].add((pagename, section))
formatting[name.text] = name formatting[name.text] = name
storfile = directive_groups['specifiers'] storfile = directive_groups['specifiers']
@ -93,18 +96,30 @@ def _extract_directives(directive_groups, formatting, page):
continue continue
if name.attrib.get('index') == 'false': if name.attrib.get('index') == 'false':
continue continue
storfile[name.text].append((pagename, section)) storfile[name.text].add((pagename, section))
formatting[name.text] = name formatting[name.text] = name
for name in t.iterfind(".//literal[@class='specifiers']"): for name in t.iterfind(".//literal[@class='specifiers']"):
storfile[name.text].append((pagename, section)) storfile[name.text].add((pagename, section))
formatting[name.text] = name formatting[name.text] = name
# Serialize to allow pickling
formatting = {name:xml_print(value) for name, value in formatting.items()}
return directive_groups, formatting
def extract_directives(arg):
page, names = arg
try:
return _extract_directives(page, names)
except Exception:
raise ValueError("Failed to process {}".format(page))
def _make_section(template, name, directives, formatting): def _make_section(template, name, directives, formatting):
varlist = template.find(".//*[@id='{}']".format(name)) varlist = template.find(".//*[@id='{}']".format(name))
for varname, manpages in sorted(directives.items()): for varname, manpages in sorted(directives.items()):
entry = tree.SubElement(varlist, 'varlistentry') entry = tree.SubElement(varlist, 'varlistentry')
term = tree.SubElement(entry, 'term') term = tree.SubElement(entry, 'term')
display = deepcopy(formatting[varname]) display = tree.fromstring(formatting[varname])
term.append(display) term.append(display)
para = tree.SubElement(tree.SubElement(entry, 'listitem'), 'para') para = tree.SubElement(tree.SubElement(entry, 'listitem'), 'para')
@ -154,20 +169,26 @@ def make_page(template_path, xml_files):
"Extract directives from xml_files and return XML index tree." "Extract directives from xml_files and return XML index tree."
template = xml_parse(template_path) template = xml_parse(template_path)
names = [vl.get('id') for vl in template.iterfind('.//variablelist')] names = [vl.get('id') for vl in template.iterfind('.//variablelist')]
directive_groups = {name:collections.defaultdict(list)
for name in names} with concurrent.futures.ProcessPoolExecutor() as pool:
args = ((xml_file, names) for xml_file in xml_files)
results = list(pool.map(extract_directives, args))
directive_groups = {name:collections.defaultdict(set) for name in names}
formatting = {} formatting = {}
for page in xml_files: for d_g, f in reversed(results):
try: for group, mapping in d_g.items():
_extract_directives(directive_groups, formatting, page) for name, value in mapping.items():
except Exception: directive_groups[group][name].update(value)
raise ValueError("failed to process " + page)
formatting.update(f)
return _make_page(template, directive_groups, formatting) return _make_page(template, directive_groups, formatting)
if __name__ == '__main__': def main(output, template_path, *xml_files):
with open(sys.argv[1], 'wb') as f: with open(output, 'wb') as f:
template_path = sys.argv[2]
xml_files = sys.argv[3:]
xml = make_page(template_path, xml_files) xml = make_page(template_path, xml_files)
f.write(xml_print(xml)) f.write(xml_print(xml))
if __name__ == '__main__':
main(*sys.argv[1:])