Addició de la traducció de la vostra aplicació¶
Ubuntu Touch és una comunitat global amb diversos idiomes i dialectes. Això pot fer que la tasca de construir una aplicació sigui descoratjadora, ja sigui que esteu construint des de zero, o que porteu/forquejant i l’aplicació existent, voleu maximitzar el nombre d’usuaris disponibles a través dels idiomes disponibles. Aquesta guia esbossarà com afegir la capacitat d’afegir traduccions a la vostra aplicació si no té aquesta funció integrada.
Nota: Si sou traductor, cercant informació sobre com traduir una aplicació que ja té aquesta funció integrada a l’aplicació, si us plau, consulteu la Documentació de traduccions, a.
Com es tradueix un text (fons tècnic)¶
Tot i que aquesta secció ja existeix a documentació de traduccions, a l’apartat contribuir, és primordial que entengueu el fons tècnic abans de procedir a afegir-lo a la vostra sol·licitud.
La majoria d’aplicacions que s’executen a Ubuntu Touch utilitzen GNU gettext per a traduccions. Un fitxer de plantilla .pot conté les cadenes de caràcters de l’aplicació. A partir d’aquesta plantilla per a cada idioma es deriva un fitxer .po individual. Aquests fitxers .po contenen les traduccions reals. Per afegir un idioma nou cal crear un fitxer .po nou. Per traduir una cadena cal editar el fitxer .po. Al costat de la cadena original (anglès en la majoria dels casos) cal introduir la traducció adequada seguint la sintaxi del fitxer gettext .po. Algunes aplicacions utilitzen QtLinguist per a la traducció. Segueix els mateixos principis utilitzant només fitxers .ts per a traduccions amb una altra sintaxi. Com a plantilla s’utilitza el fitxer .ts.
Dins d’una app les cadenes estan marcades d’aquesta manera i18n.tr("cadena") quan s’utilitza gettext o com aquesta tr("cadena") quan s’utilitza QtLinguist. Quan es construeix l’aplicació, aquestes cadenes traduïbles s’extreuen i s’escriuen als fitxers de plantilla .pot o .ts. Els fitxers d’idioma .po i .ts s’han d’actualitzar des de la seva plantilla.
Un cop traduïdes les cadenes, es posen a disposició dels usuaris amb una nova versió d’una aplicació.
Què ha de fer un desenvolupador en construir una nova aplicació per a Ubuntu Touch?¶
La manera recomanada de construir qualsevol aplicació per a Ubuntu Touch des de zero, és utilitzar una de les plantilles clickable amb l’ordre clickable create. Aquestes plantilles ja inclouen la capacitat de tenir traduccions incorporades a l’aplicació i requeriran un mínim esforç per part vostra per facilitar l’ús de traduccions amb la vostra aplicació. Si comenceu amb una de les plantilles clickable, a mesura que creeu l’aplicació, cada cadena de text s’hauria de marcar d’aquesta manera i18n.tr("cadena") quan s’utilitza gettext o com aquesta tr("cadena") quan s’utilitza QtLinguist. Heus aquí un exemple d’un botó que utilitza el marcatge adequat:
Button {
id: menuNewGame
text: i18n.tr("New Game")
gradient: LomiriColors.orangeGradient
anchors {
margins: units.gu(2)
centerIn: parent
}
onClicked: {
aNewGame()
}
}
Noteu que el camp text: té la marca 18n.tr("cadena") per a la vora de "Joc nou". Quan es construeix l’aplicació, els fitxers CMakelist.txt tenen una crida a gettext, que actualitzarà els fitxers de llengua en el directori ./po d’aquesta entrada. Es veurà així:
#: ../components/Menu.qml:196
msgid "New Game"
msgstr ""
L’ús de les plantilles clickable garantirà que cada vegada que editeu i construïu la vostra nova aplicació, els fitxers .po i .ts s’actualitzaran automàticament amb totes les cadenes disponibles a la vostra aplicació.
Com afegiu traduccions a una aplicació existent?¶
Si ja heu començat a construir una aplicació sense utilitzar les plantilles clicables, o potser esteu portant una aplicació existent, o fins i tot actualitzant una aplicació Ubuntu Touch antiga per a versions més noves d’Ubuntu Touch, és probable que no tingui aquesta funció de construcció de traduccions en el codi de construcció existent. Això està bé, ja que aquesta funcionalitat de gettext i traducció es pot afegir a l’aplicació existent.
Primer, creeu una carpeta al directori arrel de la vostra aplicació anomenada po. Dins d’aquest directori, creeu un fitxer anomenat CMakeLists.txt, i ompliu-lo amb aquesta informació per a cridar gettext:
1 include(FindGettext)
2 find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
3
4 set(DOMAIN ${FULL_PROJECT_NAME})
5 set(POT_FILE ${DOMAIN}.pot)
6 file(GLOB PO_FILES *.po)
7
8 # Creates the .pot file containing the translations template
9 add_custom_target(${POT_FILE} ALL
10 COMMENT "Generating translation template"
11 COMMAND ${INTLTOOL_EXTRACT} --update --type=gettext/ini
12 --srcdir=${CMAKE_SOURCE_DIR} ${DESKTOP_FILE_NAME}.in
13
14 COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} -o ${POT_FILE}
15 -D ${CMAKE_CURRENT_SOURCE_DIR}
16 -D ${CMAKE_CURRENT_BINARY_DIR}
17 --from-code=UTF-8
18 --c++ --qt --language=javascript --add-comments=TRANSLATORS
19 --keyword=tr --keyword=tr:1,2 --keyword=ctr:1c,2 --keyword=dctr:2c,3 --keyword=N_ --keyword=_
20 --keyword=dtr:2 --keyword=dtr:2,3 --keyword=tag --keyword=tag:1c,2
21 --package-name='${DOMAIN}'
22 --sort-by-file
23 ${I18N_SRC_FILES}
24 COMMAND ${CMAKE_COMMAND} -E copy ${POT_FILE} ${CMAKE_CURRENT_SOURCE_DIR})
25
26 # Builds the binary translations catalog for each language
27 # it finds source translations (*.po) for
28 foreach(PO_FILE ${PO_FILES})
29 get_filename_component(LANG ${PO_FILE} NAME_WE)
30 gettext_process_po_files(${LANG} ALL PO_FILES ${PO_FILE})
31 set(INSTALL_DIR ${CMAKE_INSTALL_LOCALEDIR}/share/locale/${LANG}/LC_MESSAGES)
32 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo
33 DESTINATION ${INSTALL_DIR}
34 RENAME ${DOMAIN}.mo)
35 endforeach(PO_FILE)
A continuació, haureu d’afegir aquest codi al fitxer principal CMakeLists.txt del vostre projecte:
1 add_subdirectory(po)
2
3 file(GLOB_RECURSE I18N_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po *.qml *.js)
4 list(FILTER I18N_SRC_FILES EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/build/.*" )
5 list(APPEND I18N_SRC_FILES ${DESKTOP_FILE_NAME}.in.h)
6
7 find_program(INTLTOOL_MERGE intltool-merge)
8 if(NOT INTLTOOL_MERGE)
9 message(FATAL_ERROR "Could not find intltool-merge, please install the intltool package")
10 endif()
11 find_program(INTLTOOL_EXTRACT intltool-extract)
12 if(NOT INTLTOOL_EXTRACT)
13 message(FATAL_ERROR "Could not find intltool-extract, please install the intltool package")
14 endif()
15
16 add_custom_target(${DESKTOP_FILE_NAME} ALL
17 COMMENT "Merging translations into ${DESKTOP_FILE_NAME}..."
18 COMMAND LC_ALL=C ${INTLTOOL_MERGE} -d -u ${CMAKE_SOURCE_DIR}/po ${CMAKE_SOURCE_DIR}/${DESKTOP_FILE_NAME}.in ${DESKTOP_FILE_NAME}
19 COMMAND sed -i 's/${PROJECT_NAME}-//g' ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME}
20 )
21
22 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE_NAME} DESTINATION ${DATA_DIR})
També podeu afegir informació d’aclariment a la part superior del fitxer CMakeLists.txt del vostre projecte:
1 set(PROJECT_NAME "Your project")
2 set(FULL_PROJECT_NAME "Your.project")
3 set(CMAKE_INSTALL_PREFIX /)
4 set(DATA_DIR /)
5 set(DESKTOP_FILE_NAME ${PROJECT_NAME}.desktop)
Tot el que queda ara és marcar el text dins de l’aplicació amb els marcadors i18n.tr(«cadena») o tr(«cadena»). Només podeu editar els camps de text existents afegint aquests marcadors, com en aquest exemple de botó:
Button {
id: returnToGame
text: i18n.tr("Return to game")
gradient: LomiriColors.orangeGradient
visible: false
anchors {
margins: units.gu(2)
top: menuSave.bottom
horizontalCenter: parent.horizontalCenter
}
onClicked: {
mainView.menu = false;
}
}
On hem editat el camp text: per a tenir el marcatge i18n.tr("cadena") per a la cadena "Retorn a la partida". Ara, quan executeu el procés de construcció, el cmake cridarà automàticament el programa gettext i llegirà tots els fitxers *.qml i *.js (en aquest exemple), i crearà el fitxer .pot necessari per a la vostra aplicació, que els traductors ara poden utilitzar per traduir la vostra aplicació.
Si necessiteu més exemples de fer aquestes edicions, podeu veure aquestes comissions de CitySim per ajudar-vos:
Reorganitza per a la capacitat de traducció