code: public function save($filePath, $messages)
      {
          $language = str_replace('-', '_', basename(dirname($filePath)));
          $headers = [
              'msgid ""',
              'msgstr ""',
              '"Project-Id-Version: \n"',
              '"POT-Creation-Date: \n"',
              '"PO-Revision-Date: \n"',
              '"Last-Translator: \n"',
              '"Language-Team: \n"',
              '"Language: ' . $language . '\n"',
              '"MIME-Version: 1.0\n"',
              '"Content-Type: text/plain; charset=' . Yii::$app->charset . '\n"',
              '"Content-Transfer-Encoding: 8bit\n"',
          ];
          $content = implode("\n", $headers) . "\n\n";
          foreach ($messages as $id => $message) {
              $separatorPosition = strpos($id, chr(4));
              if ($separatorPosition !== false) {
                  $content .= 'msgctxt "' . substr($id, 0, $separatorPosition) . "\"\n";
                  $id = substr($id, $separatorPosition + 1);
              }
              $content .= 'msgid "' . $this->encode($id) . "\"\n";
              $content .= 'msgstr "' . $this->encode($message) . "\"\n\n";
          }
          file_put_contents($filePath, $content);
      }
docs: Saves messages to a PO file.
  @param string $filePath file path
  @param array $messages message translations. Array keys are source messages and array values are
  translated messages: source message => translated message. Note if the message has a context,
  the message ID must be prefixed with the context with chr(4) as the separator.