diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index ad4c130fb87d2c135179530d5eeae8ba532cc15c..24c44e84153b4c76ad63f2bb82bd34f3e596ca64 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -64,6 +64,26 @@ class UpdateTranslatableStringsCommand extends Command ); } + /** + * Clone the entries from $iterator into the passed Translations object. + * It is expected that $iterator was made by getIterator() on Translations. + * This can be useful as the entries are cloned in the iterator order. + * + * @param Gettext\Translations $ret + * @param iterable $iterator + * @return $ret + */ + protected function cloneIteratorToTranslations(Translations $ret, iterable $iterator): Translations + { + while ($iterator->valid()) { + $ret->addOrMerge( + $iterator->current(), + Merge::TRANSLATIONS_THEIRS | Merge::COMMENTS_OURS | Merge::HEADERS_OURS | Merge::REFERENCES_OURS, + ); + $iterator->next(); + } + return $ret; + } /** * @param \Symfony\Component\Console\Input\InputInterface $input @@ -159,6 +179,16 @@ class UpdateTranslatableStringsCommand extends Command Merge::TRANSLATIONS_THEIRS | Merge::COMMENTS_OURS | Merge::HEADERS_OURS | Merge::REFERENCES_OURS, ); + // + // Sort the translations in a predictable way + // + $iter = $merged->getIterator(); + $iter->ksort(); + $merged = $this->cloneIteratorToTranslations( + Translations::create($merged->getDomain(), $merged->getLanguage()), + $iter, + ); + $poGenerator->generateFile($merged, $poFile->getPathName()); } }