1
# Translations.cmake, CMake macros written for Marlin, feel free to re-use them
2
include(CMakeParseArguments)
3
# be sure that all languages are present
4
# Using all usual languages code from https://www.gnu.org/software/gettext/manual/html_node/Language-Codes.html#Language-Codes
5
# Rare language codes should be added on-demand.
6
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
macro (add_translations_directory NLS_PACKAGE)
9
add_custom_target (i18n ALL COMMENT “Building i18n messages.”)
10
find_program (MSGFMT_EXECUTABLE msgfmt)
11
foreach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
12
create_po_file (${LANGUAGE_NEEDED} ${CMAKE_CURRENT_SOURCE_DIR})
13
endforeach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
14
# generate .mo from .po
15
file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po)
16
foreach (PO_INPUT ${PO_FILES})
17
get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME_WE)
18
set (MO_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PO_INPUT_BASE}.mo)
19
add_custom_command (TARGET i18n COMMAND ${MSGFMT_EXECUTABLE} -o ${MO_OUTPUT} ${PO_INPUT})
21
install (FILES ${MO_OUTPUT} DESTINATION
22
share/locale/${PO_INPUT_BASE}/LC_MESSAGES
23
RENAME ${NLS_PACKAGE}.mo)
24
endforeach (PO_INPUT ${PO_FILES})
25
endmacro (add_translations_directory)
27
# Apply the right default template.
28
macro (create_po_file LANGUAGE_NEEDED DIRECTORY)
29
set (FILE ${DIRECTORY}/${LANGUAGE_NEEDED}.po)
30
if (NOT EXISTS ${DIRECTORY}/${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})
111
add_custom_target (pot COMMENT “Building translation catalog.”)
112
find_program (XGETTEXT_EXECUTABLE xgettext)
113
find_program (INTLTOOL_EXTRACT_EXECUTABLE intltool-extract)
114
find_program (MSG_MERGE msgmerge)
116
set(EXTRA_PO_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extra)
118
set(TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot)
119
set(EXTRA_TEMPLATE ${EXTRA_PO_DIR}/extra.pot)
125
foreach(FILES_INPUT ${ARGN})
126
if((${FILES_INPUT} MATCHES ${CMAKE_SOURCE_DIR}) OR (${FILES_INPUT} MATCHES ${CMAKE_BINARY_DIR}))
127
set(BASE_DIRECTORY ${FILES_INPUT})
129
set(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT})
132
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.c)
133
foreach(C_FILE ${SOURCE_FILES})
134
set(C_SOURCE ${C_SOURCE} ${C_FILE})
137
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.vala)
138
foreach(VALA_FILE ${SOURCE_FILES})
139
set(VALA_SOURCE ${VALA_SOURCE} ${VALA_FILE})
142
file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.ui)
143
foreach(GLADE_FILE ${SOURCE_FILES})
144
set(GLADE_SOURCE ${GLADE_SOURCE} ${GLADE_FILE})
148
set (XGETTEXT_C_ARGS --add-comments="/" --keyword="_" --keyword="N_" --keyword="C_:1c,2" --keyword="NC_:1c,2" --keyword="ngettext:1,2" --keyword="Q_:1g")
149
set(BASE_XGETTEXT_COMMAND
150
${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE}
152
${XGETTEXT_C_ARGS} --from-code=UTF-8)
154
set(EXTRA_XGETTEXT_COMMAND
155
${XGETTEXT_EXECUTABLE} -d extra
156
-o ${EXTRA_TEMPLATE} --no-location --from-code=UTF-8)
158
set (INTLTOOL_EXTRACT_COMMAND
159
${INTLTOOL_EXTRACT_EXECUTABLE} --local --srcdir=/)
161
set(CONTINUE_FLAG "")
163
IF(NOT "${C_SOURCE}" STREQUAL "")
164
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${C_SOURCE})
165
set(CONTINUE_FLAG "-j")
168
IF(NOT "${VALA_SOURCE}" STREQUAL "")
169
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${CONTINUE_FLAG} -LC\# ${VALA_SOURCE})
170
set(CONTINUE_FLAG "-j")
173
IF(NOT "${GLADE_SOURCE}" STREQUAL "")
174
add_custom_command (TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${CONTINUE_FLAG} -LGlade ${GLADE_SOURCE})
176
# Then we have to update all the .po files
177
add_custom_target (po COMMENT “Syncing translation files.”)
178
add_dependencies (po pot)
179
file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po)
180
foreach (PO_INPUT ${PO_FILES})
181
get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME)
182
add_custom_command (TARGET po WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${MSG_MERGE} --update ${PO_INPUT_BASE} ${TEMPLATE} --force-po)
183
endforeach (PO_INPUT ${PO_FILES})
186
# We need to create the directory if one extra content exists.
187
IF((NOT "${ARGS_DESKTOP_FILES}" STREQUAL "") OR (NOT "${ARGS_APPDATA_SOURCE}" STREQUAL "") OR (NOT "${ARGS_SCHEMA_SOURCE}" STREQUAL ""))
188
file(MAKE_DIRECTORY ${EXTRA_PO_DIR})
189
foreach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
190
create_po_file (${LANGUAGE_NEEDED} ${EXTRA_PO_DIR})
191
endforeach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
194
set(CONTINUE_FLAG "")
196
foreach(DESKTOP_SOURCE ${ARGS_DESKTOP_FILES})
197
get_filename_component(DESKTOP_SOURCE ${DESKTOP_SOURCE} ABSOLUTE)
198
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/keys ${DESKTOP_SOURCE})
199
get_filename_component(DESKTOP_SOURCE_NAME ${DESKTOP_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/${DESKTOP_SOURCE_NAME}.h)
201
set(CONTINUE_FLAG "-j")
204
foreach(APPDATA_SOURCE ${ARGS_APPDATA_FILES})
205
get_filename_component(APPDATA_SOURCE ${APPDATA_SOURCE} ABSOLUTE)
206
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/xml ${APPDATA_SOURCE})
207
get_filename_component(APPDATA_SOURCE_NAME ${APPDATA_SOURCE} NAME)
208
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)
209
set(CONTINUE_FLAG "-j")
212
foreach(SCHEMA_SOURCE ${ARGS_SCHEMA_FILES})
213
get_filename_component(SCHEMA_SOURCE ${SCHEMA_SOURCE} ABSOLUTE)
214
add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${INTLTOOL_EXTRACT_COMMAND} --type=gettext/schemas ${SCHEMA_SOURCE})
215
get_filename_component(SCHEMA_SOURCE_NAME ${SCHEMA_SOURCE} NAME)
216
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)
217
set(CONTINUE_FLAG "-j")
220
file (GLOB PO_FILES ${EXTRA_PO_DIR}/*.po)
221
foreach (PO_INPUT ${PO_FILES})
222
get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME)
223
add_custom_command (TARGET po COMMAND WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ${MSG_MERGE} --update ${PO_INPUT_BASE} ${EXTRA_TEMPLATE})
224
endforeach (PO_INPUT ${PO_FILES})