Home Explore Blog CI



neovim

1st chunk of `src/nvim/po/CMakeLists.txt`
355e0d0c00e2c1829de2a89ab39e51fabff50df99bc235ec0000000100000a98
option(ENABLE_TRANSLATIONS "Localizations to build" OFF)
if(NOT ENABLE_TRANSLATIONS)
  return()
endif()

find_package(Gettext REQUIRED)
find_program(XGETTEXT_PRG xgettext)
find_program(ICONV_PRG iconv)
mark_as_advanced(
  GETTEXT_MSGFMT_EXECUTABLE
  GETTEXT_MSGMERGE_EXECUTABLE
  ICONV_PRG
  XGETTEXT_PRG)

if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG)
  set(LANGUAGES
    af
    ca
    cs
    da
    de
    en_GB
    eo
    es
    fi
    fr
    ga
    it
    ja
    ko.UTF-8
    nl
    no
    pl.UTF-8
    pt_BR
    ru
    sk
    sv
    tr
    uk
    vi
    zh_CN.UTF-8
    zh_TW.UTF-8)

  set(ENV{OLD_PO_FILE_INPUT} yes)
  set(ENV{OLD_PO_FILE_OUTPUT} yes)

  set(NVIM_RELATIVE_SOURCES)
  foreach(SRC ${NVIM_SOURCES} ${NVIM_HEADERS})
    file(RELATIVE_PATH RELATIVE_SRC ${CMAKE_CURRENT_SOURCE_DIR} ${SRC})
    list(APPEND NVIM_RELATIVE_SOURCES ${RELATIVE_SRC})
  endforeach()

  set(NVIM_POT ${CMAKE_CURRENT_BINARY_DIR}/nvim.pot)

  list(SORT NVIM_RELATIVE_SOURCES)
  add_custom_command(
    OUTPUT ${NVIM_POT}
    COMMAND $<TARGET_FILE:nvim_bin> -u NONE -i NONE -n --headless --cmd "set cpo+=+"
      -c "silent source ${CMAKE_CURRENT_SOURCE_DIR}/tojavascript.vim"
      ${NVIM_POT} ${PROJECT_SOURCE_DIR}/runtime/optwin.vim
    COMMAND ${XGETTEXT_PRG} -o ${NVIM_POT} --default-domain=nvim
      --add-comments --keyword=_ --keyword=N_ --keyword=NGETTEXT:1,2
      -D ${CMAKE_CURRENT_SOURCE_DIR} -D ${CMAKE_CURRENT_BINARY_DIR}
      ${NVIM_RELATIVE_SOURCES} optwin.js
    COMMAND $<TARGET_FILE:nvim_bin> -u NONE -i NONE -n --headless --cmd "set cpo+=+"
      -c "silent source ${CMAKE_CURRENT_SOURCE_DIR}/fixfilenames.vim"
      ${NVIM_POT} ${PROJECT_SOURCE_DIR}/runtime/optwin.vim
    VERBATIM
    DEPENDS ${NVIM_SOURCES} nvim_bin nvim_runtime_deps)

  set(LANGUAGE_MO_FILES)
  set(UPDATE_PO_TARGETS)

  macro(BuildMo name)
    set(poFile ${CMAKE_CURRENT_SOURCE_DIR}/${name}.po)
    set(moFile ${CMAKE_CURRENT_BINARY_DIR}/${name}.mo)

    add_custom_command(
      OUTPUT ${moFile}
      COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${moFile} ${poFile}
      DEPENDS ${poFile} ${NVIM_POT})

    install_helper(
      FILES ${moFile}
      DESTINATION ${CMAKE_INSTALL_LOCALEDIR}/${name}/LC_MESSAGES
      RENAME ${PROJECT_NAME}.mo)

    list(APPEND LANGUAGE_MO_FILES ${moFile})
  endmacro()

  macro(CheckPo name)
    set(poFile ${CMAKE_CURRENT_SOURCE_DIR}/${name}.po)

    add_custom_target(check-po-${name}
      COMMAND $<TARGET_FILE:nvim_bin> -u NONE -n -e
          -S ${CMAKE_CURRENT_SOURCE_DIR}/check.vim
          -c "if error == 0 | q | endif" -c cq ${poFile} ||
          ${CMAKE_COMMAND} -E echo "${name}.po failed the check."
      COMMENT "Checking ${name}.po"
      VERBATIM

Title: Configuring Translation Support with Gettext
Summary
This section configures translation support for the project using Gettext, including finding necessary tools like xgettext and iconv. It defines a list of supported languages, sets up the environment for PO file processing, extracts translatable strings from source files, and generates MO files for each language. Macros are defined to build MO files and check PO files for errors, ensuring the project can be localized effectively.