diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -27,6 +27,7 @@ Output/Mercurial-*.exe
 .DS_Store
 tags
 cscope.*
+i18n/hg.pot
 
 syntax: regexp
 ^\.pc/
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,7 @@ help:
 	@echo '  dist         - run all tests and create a source tarball in dist/'
 	@echo '  clean        - remove files created by other targets'
 	@echo '                 (except installed files or dist source tarball)'
+	@echo '  update-pot   - update i18n/hg.pot'
 	@echo
 	@echo 'Example for a system-wide installation under /usr/local:'
 	@echo '  make all && su -c "make install" && hg version'
@@ -74,6 +75,14 @@ tests:
 test-%:
 	cd tests && $(PYTHON) run-tests.py $(TESTFLAGS) $@
 
+update-pot:
+	mkdir -p i18n
+	pygettext -d doc -p i18n --docstrings \
+	mercurial/commands.py hgext/*.py hgext/*/__init__.py
+	pygettext -d all -p i18n mercurial hgext doc
+	msgcat i18n/doc.pot i18n/all.pot > i18n/hg.pot
+	rm i18n/doc.pot i18n/all.pot
 
 .PHONY: help all local build doc clean install install-bin install-doc \
-	install-home install-home-bin install-home-doc dist dist-notests tests
+	install-home install-home-bin install-home-doc dist dist-notests tests \
+	update-pot
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -149,6 +149,12 @@ try:
 except ImportError:
     pass
 
+datafiles = []
+for root in ('templates', 'i18n'):
+    for dir, dirs, files in os.walk(root):
+        datafiles.append((os.path.join('mercurial', dir),
+                          [os.path.join(dir, file_) for file_ in files]))
+
 setup(name='mercurial',
       version=version,
       author='Matt Mackall',
@@ -159,9 +165,7 @@ setup(name='mercurial',
       scripts=scripts,
       packages=packages,
       ext_modules=ext_modules,
-      data_files=[(os.path.join('mercurial', root),
-                   [os.path.join(root, file_) for file_ in files])
-                  for root, dirs, files in os.walk('templates')],
+      data_files=datafiles,
       cmdclass=cmdclass,
       options=dict(py2exe=dict(packages=['hgext', 'email']),
                    bdist_mpkg=dict(zipdist=True,