updatepo.sh 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/bin/sh
  2. # Update/create minetest po files
  3. # an auxiliary function to abort processing with an optional error
  4. # message
  5. abort() {
  6. test -n "$1" && echo >&2 "$1"
  7. exit 1
  8. }
  9. # The po/ directory is assumed to be parallel to the directory where
  10. # this script is. Relative paths are fine for us so we can just
  11. # use the following trick (works both for manual invocations and for
  12. # script found from PATH)
  13. scriptisin="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  14. # The script is executed from the parent of po/, which is also the
  15. # parent of the script directory and of the src/ directory.
  16. # We go through $scriptisin so that it can be executed from whatever
  17. # directory and still work correctly
  18. cd "$scriptisin/.."
  19. test -e po || abort "po/ directory not found"
  20. test -d po || abort "po/ is not a directory!"
  21. # Get a list of the languages we have to update/create
  22. cd po || abort "couldn't change directory to po!"
  23. # This assumes that we won't have dirnames with space, which is
  24. # the case for language codes, which are the only subdirs we expect to
  25. # find in po/ anyway. If you put anything else there, you need to suffer
  26. # the consequences of your actions, so we don't do sanity checks
  27. langs=""
  28. for lang in * ; do
  29. if test ! -d $lang; then
  30. continue
  31. fi
  32. langs="$langs $lang"
  33. done
  34. # go back
  35. cd ..
  36. # First thing first, update the .pot template. We place it in the po/
  37. # directory at the top level. You a recent enough xgettext that supports
  38. # --package-name
  39. potfile=po/minetest.pot
  40. echo "updating pot"
  41. xgettext --package-name=minetest \
  42. --add-comments='~' \
  43. --sort-by-file \
  44. --add-location=file \
  45. --keyword=N_ \
  46. --keyword=wgettext \
  47. --keyword=fwgettext \
  48. --keyword=fgettext \
  49. --keyword=fgettext_ne \
  50. --keyword=strgettext \
  51. --keyword=wstrgettext \
  52. --keyword=core.gettext \
  53. --keyword=showTranslatedStatusText \
  54. --keyword=fmtgettext \
  55. --output $potfile \
  56. --from-code=utf-8 \
  57. `find src/ -name '*.cpp' -o -name '*.h'` \
  58. `find builtin/ -name '*.lua'`
  59. # Gettext collects a bunch of bogus comments for the "Available commands: " string
  60. # I couldn't figure out how to avoid that so get rid of them afterwards
  61. sed '/^#\. ~<number>.*relative_to/,/^#: /{ /^#: /!d; }' -i $potfile
  62. # Now iterate on all languages and create the po file if missing, or update it
  63. # if it exists already
  64. for lang in $langs ; do # note the missing quotes around $langs
  65. pofile=po/$lang/minetest.po
  66. if test -e $pofile; then
  67. echo "[$lang]: updating strings"
  68. msgmerge --update --sort-by-file $pofile $potfile
  69. else
  70. # This will ask for the translator identity
  71. echo "[$lang]: NEW strings"
  72. msginit --locale=$lang --output-file=$pofile --input=$potfile
  73. fi
  74. done