diff --git a/bin/convertTranslations.php b/bin/convertTranslations.php
new file mode 100644
index 0000000000000000000000000000000000000000..d19933c6b6d80b7c84db607ff5a1abc16654b588
--- /dev/null
+++ b/bin/convertTranslations.php
@@ -0,0 +1,129 @@
+<?php
+
+function mergeWithSource($sourcePairs, $destPairs)
+{
+    $mergedPairs = [];
+
+    foreach ($sourcePairs as $msgId => $msgStr) {
+        if (array_key_exists($msgId, $destPairs)) {
+            // the index is becoming the msgId but comes as the string "msgstr" from the file, so convert it
+            $mergedPairs[preg_replace("/^msgstr/", "msgid", $msgStr)] = $destPairs[$msgId];
+        } else {
+            $mergedPairs[preg_replace("/^msgstr/", "msgid", $msgStr)] = "msgstr \"\"\n";
+        }
+    }
+    return $mergedPairs;
+}
+
+function codifyWithSource($sourcePairs, $destPairs)
+{
+    $mergedPairs = [];
+
+    foreach ($sourcePairs as $msgId => $msgStr) {
+        $modifiedKey = preg_replace("/^msgstr/", "msgid", $msgStr);
+        if (isset($destPairs[$modifiedKey])) {
+            $mergedPairs[$msgId] = $destPairs[$modifiedKey];
+        } else {
+            $mergedPairs[$msgId] = "msgstr \"\"\n";
+        }
+    }
+    return $mergedPairs;
+}
+
+function dissectFile($fileInputRaw)
+{
+    $pairs = [];
+// create an array with MSGID => MSGSTR
+    foreach ($fileInputRaw as $rowIndex => $oneLine) {
+        if (preg_match("/^msgid/", $oneLine)) {
+            $msgId = $oneLine;
+            $nextLineCountMsgId = $rowIndex + 1;
+            while (substr($fileInputRaw[$nextLineCountMsgId], 0, 1) === '"') {
+                $msgId .= $fileInputRaw[$nextLineCountMsgId];
+                $nextLineCountMsgId = $nextLineCountMsgId + 1;
+            }
+            // we now have the full msgid in $msgid. Now find the full subsequent msgstr
+            // msgstr immediately follows the last msgid line; and can continue on
+            // multiple lines itself
+            $msgStr = $fileInputRaw[$nextLineCountMsgId];
+            $nextLineCountMsgStr = $nextLineCountMsgId + 1;
+            while (isset($fileInputRaw[$nextLineCountMsgStr]) && substr($fileInputRaw[$nextLineCountMsgStr], 0, 1) === '"') {
+                $msgStr .= $fileInputRaw[$nextLineCountMsgStr];
+                $nextLineCountMsgStr = $nextLineCountMsgStr + 1;
+            }
+            $pairs[$msgId] = $msgStr;
+        }
+    }
+    return $pairs;
+}
+
+if (!isset($argv[3])) {
+    fwrite(STDERR, "
+This script needs three arguments:
+
+1) MERGE, CODIFY or SOURCEONLY
+   - MERGE creates a .po file with source-lang as msgId and dest-lang as msgStr
+   - CODIFY creates a .po file with the common codes as msgId and dest-lang as msgStr
+   - SOURCEONLY creates a .po file with source-lang as msgId and an empty msgStr
+
+2) filename of the .po with codes as msgStr and the source language (typically English) as msgStr
+
+3) in case of 
+   - MERGE, SOURCEONLY: filename of the .po with codes as msgStr and the destination language as msgStr
+   - CODIFY: filename of the .po file with source language as msgId and destination language as msgStr
+     (i.e. the input to CODIFY is the result of a previous MERGE)
+   
+
+");
+    exit(1);
+}
+
+switch ($argv[1]) {
+    case "MERGE":
+        fwrite(STDERR, "Will merge two language into one .po file based on identical msgIds.\n");
+        break;
+    case "CODIFY":
+        fwrite(STDERR, "Will create .po file with codes as msgIds and dest langauge translations as msgStr.\n");
+        break;
+    case "SOURCEONLY":
+        fwrite(STDERR, "Will create .po file with source lang msgid and empty msgstr.\n");
+        break;
+    default:
+        fwrite(STDERR, "The first parameter is either MERGE or CODIFY.\n");
+        exit(1);
+}
+
+$sourceLangRaw = file($argv[2]);
+$destLangRaw = file($argv[3]);
+
+if ($sourceLangRaw === FALSE || $destLangRaw === FALSE) {
+    fwrite(STDERR, "At least one input file was not readable!\n");
+    exit(1);
+}
+
+$sourcePairs = dissectFile($sourceLangRaw);
+$destPairs = dissectFile($destLangRaw);
+
+switch ($argv[1]) {
+    case "SOURCEONLY":
+        fwrite(STDERR, "Merging (for nullify) " . count($sourcePairs) . " entries from source language (destination language has " . count($destPairs) . " already.\n");
+        $outputPairs = mergeWithSource($sourcePairs, $destPairs);
+        foreach ($outputPairs as $key => $value) {
+            $outputPairs[$key] = "msgstr \"\"\n";
+        }
+        break;
+    case "MERGE":
+        fwrite(STDERR, "Merging " . count($sourcePairs) . " entries from source language (destination language has " . count($destPairs) . " already.\n");
+        $outputPairs = mergeWithSource($sourcePairs, $destPairs);
+        break;
+    case "CODIFY":
+        fwrite(STDERR, "Codifying " . count($sourcePairs) . " entries from destination language (pool has " . count($destPairs) . " candidates).\n");
+        $outputPairs = codifyWithSource($sourcePairs, $destPairs);
+        break;
+}
+
+foreach ($outputPairs as $msgId => $msgStr) {
+    echo $msgId;
+    echo $msgStr;
+    echo "\n";
+}