mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-12-01 05:03:40 +08:00
114 lines
2.9 KiB
PHP
114 lines
2.9 KiB
PHP
|
#!/usr/bin/env php
|
||
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Compares translation files to find missing and redundant content.
|
||
|
*/
|
||
|
|
||
|
$args = array_slice($argv, 1);
|
||
|
|
||
|
if (count($args) === 0) {
|
||
|
errorOut("Please provide a language code as the first argument (./check.php fr)");
|
||
|
}
|
||
|
|
||
|
|
||
|
// Get content from files
|
||
|
$lang = formatLang($args[0]);
|
||
|
$enContent = loadLang('en');
|
||
|
$langContent = loadLang($lang);
|
||
|
|
||
|
if (count($langContent) === 0) {
|
||
|
errorOut("No language content found for '{$lang}'");
|
||
|
}
|
||
|
|
||
|
info("Checking '{$lang}' translation content against 'en'");
|
||
|
|
||
|
// Track missing lang strings
|
||
|
$missingLangStrings = [];
|
||
|
foreach ($enContent as $enKey => $enStr) {
|
||
|
if (strpos($enKey, 'settings.language_select.') === 0) {
|
||
|
unset($langContent[$enKey]);
|
||
|
continue;
|
||
|
}
|
||
|
if (!isset($langContent[$enKey])) {
|
||
|
$missingLangStrings[$enKey] = $enStr;
|
||
|
continue;
|
||
|
}
|
||
|
unset($langContent[$enKey]);
|
||
|
}
|
||
|
|
||
|
if (count($missingLangStrings) > 0) {
|
||
|
info("\n========================");
|
||
|
info("Missing language content");
|
||
|
info("========================");
|
||
|
outputFlatArray($missingLangStrings, $lang);
|
||
|
}
|
||
|
|
||
|
if (count($langContent) > 0) {
|
||
|
info("\n==========================");
|
||
|
info("Redundant language content");
|
||
|
info("==========================");
|
||
|
outputFlatArray($langContent, $lang);
|
||
|
}
|
||
|
|
||
|
function outputFlatArray($arr, $lang) {
|
||
|
$grouped = [];
|
||
|
foreach ($arr as $key => $val) {
|
||
|
$explodedKey = explode('.', $key);
|
||
|
$group = $explodedKey[0];
|
||
|
$path = implode('.', array_slice($explodedKey, 1));
|
||
|
if (!isset($grouped[$group])) $grouped[$group] = [];
|
||
|
$grouped[$group][$path] = $val;
|
||
|
}
|
||
|
foreach ($grouped as $filename => $arr) {
|
||
|
echo "\e[36m" . $lang . '/' . $filename . ".php\e[0m\n";
|
||
|
echo json_encode($arr, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE) . "\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function formatLang($lang) {
|
||
|
$langParts = explode('_', strtoupper($lang));
|
||
|
$langParts[0] = strtolower($langParts[0]);
|
||
|
return implode('_', $langParts);
|
||
|
}
|
||
|
|
||
|
function loadLang(string $lang) {
|
||
|
$dir = __DIR__ . "/{$lang}";
|
||
|
if (!file_exists($dir)) {
|
||
|
errorOut("Expected directory '{$dir}' does not exist");
|
||
|
}
|
||
|
$files = scandir($dir);
|
||
|
$data = [];
|
||
|
foreach ($files as $file) {
|
||
|
if (substr($file, -4) !== '.php') continue;
|
||
|
$fileData = include ($dir . '/' . $file);
|
||
|
$name = substr($file, 0, -4);
|
||
|
$data[$name] = $fileData;
|
||
|
}
|
||
|
return flattenArray($data);
|
||
|
}
|
||
|
|
||
|
function flattenArray(array $arr) {
|
||
|
$data = [];
|
||
|
foreach ($arr as $key => $arrItem) {
|
||
|
if (!is_array($arrItem)) {
|
||
|
$data[$key] = $arrItem;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$toUse = flattenArray($arrItem);
|
||
|
foreach ($toUse as $innerKey => $item) {
|
||
|
$data[$key . '.' . $innerKey] = $item;
|
||
|
}
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function info($text) {
|
||
|
echo "\e[34m" . $text . "\e[0m\n";
|
||
|
}
|
||
|
|
||
|
function errorOut($text) {
|
||
|
echo "\e[31m" . $text . "\e[0m\n";
|
||
|
exit(1);
|
||
|
}
|