1
1
# Translations.cmake, CMake macros written for Marlin, feel free to re-use them
2
include(CMakeParseArguments)
3
macro(add_translations_directory NLS_PACKAGE)
4
macro (add_translations_directory NLS_PACKAGE)
4
5
add_custom_target (i18n ALL COMMENT “Building i18n messages.”)
5
6
find_program (MSGFMT_EXECUTABLE msgfmt)
6
7
# be sure that all languages are present
7
set (LANGUAGES_NEEDED af am ar ast az be bg bn bs ca ckb cs da de el en_AU en_CA en_GB eo es et eu fa fi fr fr_CA gl he hi hr hu hy id it ja ka ko ky lb lo lt lv ml mr ms nb nl nn pl pt pt_BR ro ru rue si sk sl sma sq sr sv sw ta te th tr uk vi zh_CN zh_HK zh_TW)
8
# Using all usual languages code from https://www.gnu.org/software/gettext/manual/html_node/Language-Codes.html#Language-Codes
9
# Rare language codes should be added on-demand.
10
set (LANGUAGES_NEEDED aa ab ae af ak am an ar as ast av ay az ba be bg bh bi bm bn bo br bs ca ce ch ckb co cr cs cu cv cy da de dv dz ee el en_AU en_CA en_GB eo es et eu fa ff fi fj fo fr fr_CA fy ga gd gl gn gu gv ha he hi ho hr ht hu hy hz ia id ie ig ii ik io is it iu ja jv ka kg ki kj kk kl km kn ko kr ks ku kv kw ky la lb lg li ln lo lt lu lv mg mh mi mk ml mn mo mr ms mt my na nb nd ne ng nl nn no nr nv ny oc oj om or os pa pi pl ps pt pt_BR qu rm rn ro ru rue rw sa sc sd se sg si sk sl sm sma sn so sq sr ss st su sv sw ta te tg th ti tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa wo xh yi yo za zh zh_CN zh_HK zh_TW zu)
8
11
foreach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
9
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po)
10
file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "msgid \"\"\n")
11
file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "msgstr \"\"\n")
12
file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "\"MIME-Version: 1.0\\n\"\n")
13
file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "\"Content-Type: text/plain; charset=UTF-8\\n\"\n")
12
create_po_file (${LANGUAGE_NEEDED})
15
13
endforeach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
16
14
# generate .mo from .po
17
15
file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po)
24
22
share/locale/${PO_INPUT_BASE}/LC_MESSAGES
25
23
RENAME ${NLS_PACKAGE}.mo)
26
24
endforeach (PO_INPUT ${PO_FILES})
27
endmacro(add_translations_directory)
29
macro(add_translations_catalog NLS_PACKAGE)
25
endmacro (add_translations_directory)
27
# Apply the right default template.
28
macro (create_po_file LANGUAGE_NEEDED)
29
set (FILE ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po)
30
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po)
31
file (APPEND ${FILE} "msgid \"\"\n")
32
file (APPEND ${FILE} "msgstr \"\"\n")
33
file (APPEND ${FILE} "\"MIME-Version: 1.0\\n\"\n")
34
file (APPEND ${FILE} "\"Content-Type: text/plain; charset=UTF-8\\n\"\n")
36
if ("${LANGUAGE_NEEDED}" STREQUAL "ja"
37
OR "${LANGUAGE_NEEDED}" STREQUAL "vi"
38
OR "${LANGUAGE_NEEDED}" STREQUAL "ko")
39
file (APPEND ${FILE} "\"Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\\n\"\n")
40
elseif ("${LANGUAGE_NEEDED}" STREQUAL "en"
41
OR "${LANGUAGE_NEEDED}" STREQUAL "de"
42
OR "${LANGUAGE_NEEDED}" STREQUAL "nl"
43
OR "${LANGUAGE_NEEDED}" STREQUAL "sv"
44
OR "${LANGUAGE_NEEDED}" STREQUAL "nb"
45
OR "${LANGUAGE_NEEDED}" STREQUAL "nn"
46
OR "${LANGUAGE_NEEDED}" STREQUAL "nb"
47
OR "${LANGUAGE_NEEDED}" STREQUAL "no"
48
OR "${LANGUAGE_NEEDED}" STREQUAL "fo"
49
OR "${LANGUAGE_NEEDED}" STREQUAL "es"
50
OR "${LANGUAGE_NEEDED}" STREQUAL "pt"
51
OR "${LANGUAGE_NEEDED}" STREQUAL "it"
52
OR "${LANGUAGE_NEEDED}" STREQUAL "bg"
53
OR "${LANGUAGE_NEEDED}" STREQUAL "he"
54
OR "${LANGUAGE_NEEDED}" STREQUAL "fi"
55
OR "${LANGUAGE_NEEDED}" STREQUAL "et"
56
OR "${LANGUAGE_NEEDED}" STREQUAL "eo"
57
OR "${LANGUAGE_NEEDED}" STREQUAL "hu"
58
OR "${LANGUAGE_NEEDED}" STREQUAL "tr"
59
OR "${LANGUAGE_NEEDED}" STREQUAL "es")
60
file (APPEND ${FILE} "\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n")
61
elseif ("${LANGUAGE_NEEDED}" STREQUAL "fr"
62
OR "${LANGUAGE_NEEDED}" STREQUAL "fr_CA"
63
OR "${LANGUAGE_NEEDED}" STREQUAL "pt_BR")
64
file (APPEND ${FILE} "\"Plural-Forms: nplurals=2; plural=n>1;\\n\"\n")
65
elseif ("${LANGUAGE_NEEDED}" STREQUAL "lv")
66
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\\n\"\n")
67
elseif ("${LANGUAGE_NEEDED}" STREQUAL "ro")
68
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\\n\"\n")
69
elseif ("${LANGUAGE_NEEDED}" STREQUAL "lt")
70
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n")
71
elseif ("${LANGUAGE_NEEDED}" STREQUAL "ru"
72
OR "${LANGUAGE_NEEDED}" STREQUAL "uk"
73
OR "${LANGUAGE_NEEDED}" STREQUAL "be"
74
OR "${LANGUAGE_NEEDED}" STREQUAL "sr"
75
OR "${LANGUAGE_NEEDED}" STREQUAL "hr")
76
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n")
77
elseif ("${LANGUAGE_NEEDED}" STREQUAL "cs"
78
OR "${LANGUAGE_NEEDED}" STREQUAL "sk")
79
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\"\n")
80
elseif ("${LANGUAGE_NEEDED}" STREQUAL "pl")
81
file (APPEND ${FILE} "\"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n")
82
elseif ("${LANGUAGE_NEEDED}" STREQUAL "sl")
83
file (APPEND ${FILE} "\"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\\n\"\n")
87
endmacro (create_po_file)
89
macro (configure_file_translation SOURCE RESULT PO_DIR)
90
find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge)
91
set(EXTRA_PO_DIR ${PO_DIR}/extra/)
92
get_filename_component(EXTRA_PO_DIR ${EXTRA_PO_DIR} ABSOLUTE)
94
# Intltool can't create a new directory.
95
get_filename_component(RESULT_DIRECTORY ${RESULT} DIRECTORY)
96
file(MAKE_DIRECTORY ${RESULT_DIRECTORY})
98
set (INTLTOOL_FLAG "")
99
if (${SOURCE} MATCHES ".desktop")
100
set (INTLTOOL_FLAG "--desktop-style")
101
elseif (${SOURCE} MATCHES ".gschema")
102
set (INTLTOOL_FLAG "--schemas-style")
103
elseif (${SOURCE} MATCHES ".xml")
104
set (INTLTOOL_FLAG "--xml-style")
106
execute_process (WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} --quiet ${INTLTOOL_FLAG} ${EXTRA_PO_DIR} ${SOURCE} ${RESULT})
109
macro (add_translations_catalog NLS_PACKAGE)
110
cmake_parse_arguments (ARGS "" "" "DESKTOP_FILES;APPDATA_FILES;SCHEMA_FILES" ${ARGN})
30
111
add_custom_target (pot COMMENT “Building translation catalog.”)
31
112
find_program (XGETTEXT_EXECUTABLE xgettext)
113
find_program (INTLTOOL_EXTRACT_EXECUTABLE intltool-extract)
115
set(EXTRA_PO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extra)
34
118
set(VALA_SOURCE "")
35
119
set(GLADE_SOURCE "")
37
121
foreach(FILES_INPUT ${ARGN})
38
set(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT})
122
if((${FILES_INPUT} MATCHES ${CMAKE_SOURCE_DIR}) OR (${FILES_INPUT} MATCHES ${CMAKE_BINARY_DIR}))
123
set(BASE_DIRECTORY ${FILES_INPUT})
125
set(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT})
40
128
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.c)
41
129
foreach(C_FILE ${SOURCE_FILES})
45
133
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.vala)
46
foreach(VALA_C_FILE ${SOURCE_FILES})
47
set(VALA_SOURCE ${VALA_SOURCE} ${VALA_C_FILE})
134
foreach(VALA_FILE ${SOURCE_FILES})
135
set(VALA_SOURCE ${VALA_SOURCE} ${VALA_FILE})
50
138
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.ui)
51
foreach(GLADE_C_FILE ${SOURCE_FILES})
52
set(GLADE_SOURCE ${GLADE_SOURCE} ${GLADE_C_FILE})
139
foreach(GLADE_FILE ${SOURCE_FILES})
140
set(GLADE_SOURCE ${GLADE_SOURCE} ${GLADE_FILE})
144
set (XGETTEXT_C_ARGS --add-comments="/" --keyword="_" --keyword="N_" --keyword="C_:1c,2" --keyword="NC_:1c,2" --keyword="ngettext:1,2" --keyword="Q_:1g")
56
145
set(BASE_XGETTEXT_COMMAND
57
146
${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE}
58
147
-o ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot
59
--add-comments="/" --keyword="_" --keyword="N_" --keyword="C_:1c,2" --keyword="NC_:1c,2" --keyword="ngettext:1,2" --keyword="Q_:1g" --from-code=UTF-8)
148
${XGETTEXT_C_ARGS} --from-code=UTF-8)
150
set(EXTRA_XGETTEXT_COMMAND
151
${XGETTEXT_EXECUTABLE} -d extra
152
-o ${EXTRA_PO_DIR}/extra.pot --no-location --from-code=UTF-8)
154
set (INTLTOOL_EXTRACT_COMMAND
155
${INTLTOOL_EXTRACT_EXECUTABLE} --local --srcdir=/)
157
set(CONTINUE_FLAG "")
63
159
IF(NOT "${C_SOURCE}" STREQUAL "")
64
160
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${C_SOURCE})
73
169
IF(NOT "${GLADE_SOURCE}" STREQUAL "")
74
170
add_custom_command (TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${CONTINUE_FLAG} -LGlade ${GLADE_SOURCE})
b'\\ No newline at end of file'
173
# We need to create the directory if one extra content exists.
174
IF((NOT "${ARGS_DESKTOP_FILES}" STREQUAL "") OR (NOT "${ARGS_APPDATA_SOURCE}" STREQUAL "") OR (NOT "${ARGS_SCHEMA_SOURCE}" STREQUAL ""))
175
file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/extra/)
178
set(CONTINUE_FLAG "")
180
foreach(DESKTOP_SOURCE ${ARGS_DESKTOP_FILES})
181
get_filename_component(DESKTOP_SOURCE ${DESKTOP_SOURCE} ABSOLUTE)
182
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/keys ${DESKTOP_SOURCE})
183
get_filename_component(DESKTOP_SOURCE_NAME ${DESKTOP_SOURCE} NAME)
184
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${EXTRA_XGETTEXT_COMMAND} ${CONTINUE_FLAG} ${XGETTEXT_C_ARGS} ${CMAKE_CURRENT_BINARY_DIR}/tmp/${DESKTOP_SOURCE_NAME}.h)
185
set(CONTINUE_FLAG "-j")
188
foreach(APPDATA_SOURCE ${ARGS_APPDATA_FILES})
189
get_filename_component(APPDATA_SOURCE ${APPDATA_SOURCE} ABSOLUTE)
190
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/xml ${APPDATA_SOURCE})
191
get_filename_component(APPDATA_SOURCE_NAME ${APPDATA_SOURCE} NAME)
192
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${EXTRA_XGETTEXT_COMMAND} ${CONTINUE_FLAG} ${XGETTEXT_C_ARGS} ${CMAKE_CURRENT_BINARY_DIR}/tmp/${APPDATA_SOURCE_NAME}.h)
193
set(CONTINUE_FLAG "-j")
196
foreach(SCHEMA_SOURCE ${ARGS_SCHEMA_FILES})
197
get_filename_component(SCHEMA_SOURCE ${SCHEMA_SOURCE} ABSOLUTE)
198
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/schemas ${SCHEMA_SOURCE})
199
get_filename_component(SCHEMA_SOURCE_NAME ${SCHEMA_SOURCE} NAME)
200
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${EXTRA_XGETTEXT_COMMAND} ${CONTINUE_FLAG} ${XGETTEXT_C_ARGS} ${CMAKE_CURRENT_BINARY_DIR}/tmp/${SCHEMA_SOURCE_NAME}.h)
201
set(CONTINUE_FLAG "-j")