diff --git a/transifex.py b/transifex.py
new file mode 100644
index 0000000..df6d10f
--- /dev/null
+++ b/transifex.py
@@ -0,0 +1,113 @@
+"""
+transifex.py - Tool to manage Transifex translations
+
+ u, up, update
Download all translations from Transifex
+ l, list List all translations available on Transifex
+"""
+import os
+import sys
+
+import requests
+
+API_URL = "https://www.transifex.com/api/2"
+API_KEY = os.getenv("TRANSIFEX_API_KEY")
+PROJECT_SLUG = "flex-pelican"
+RESOURCE_SLUG = "messagespot"
+
+
+def get_languages():
+ url = "{api_url}/project/{project_slug}/languages/".format(
+ **{"api_url": API_URL, "project_slug": PROJECT_SLUG,}
+ )
+
+ req = requests.get(url, auth=("api", API_KEY))
+ req.raise_for_status()
+ languages = req.json()
+
+ return sorted([lang["language_code"] for lang in languages])
+
+
+def list_languages():
+ languages = get_languages()
+
+ print("LANG LOCAL")
+
+ for lang in languages:
+ filename1 = os.path.join(".", lang, "LC_MESSAGES", "messages.po")
+ filename2 = os.path.join(
+ ".", "translations", lang, "LC_MESSAGES", "messages.po"
+ )
+
+ if os.path.exists(filename1) or os.path.exists(filename2):
+ print("{0} YES".format(lang.ljust(5)))
+ else:
+ print("{0} NO".format(lang.ljust(5)))
+
+ print("\nTotal: {}".format(len(languages)))
+
+
+def download(path):
+ languages = get_languages()
+
+ for lang in languages:
+ print("Downloading {}...".format(lang))
+
+ url = "{api_url}/project/{project_slug}/resource/{resource_slug}/translation/{lang_code}/".format(
+ **{
+ "api_url": API_URL,
+ "project_slug": PROJECT_SLUG,
+ "resource_slug": RESOURCE_SLUG,
+ "lang_code": lang,
+ }
+ )
+
+ req = requests.get(url, auth=("api", API_KEY))
+ req.raise_for_status()
+ data = req.json()
+ po_content = data["content"]
+
+ filepath = os.path.join(path, lang, "LC_MESSAGES")
+ os.makedirs(filepath, exist_ok=True)
+
+ filename = os.path.join(path, lang, "LC_MESSAGES", "messages.po")
+
+ with open(filename, "w") as f:
+ f.write(po_content)
+
+ print("{} updated".format(lang))
+
+
+def usage():
+ print(__doc__[1:])
+
+
+def _pop(l, default=None):
+ try:
+ return l.pop(0)
+ except IndexError:
+ return default
+
+
+def run():
+ args = sys.argv[1:]
+
+ cmd = _pop(args, "help")
+
+ if cmd in ["u", "up", "update"]:
+ path = _pop(args)
+
+ if path and not args:
+ download(path)
+ else:
+ usage()
+ elif cmd in ["l", "list"]:
+ if not args:
+ list_languages()
+ else:
+ usage()
+ else:
+ usage()
+
+
+if __name__ == "__main__":
+ run()