Uh oh!
There was an error while loading. Please reload this page.
feat: New command lang:sync - #9023
Conversation
There are some questions:
|
neznaika0
commented
Jul 5, 2024
I don't get the description "When there are translations in the target folder Language/ru, their keys are saved only if they exist in the Language/en folder:". Is that correct? If return [
// Deleted keys// 'more' => [// 'nested' => [// 'key' => 'Example.more.nested.key',// ],// ],'nullableKey' => null,
'numericKey' => 100000,
'status' => [
'error' => 'ru.status.error',
'done' => 'ru.status.done',
'critical' => 'ru.status.critical',
],
'title' => 'ru.title',
'mistakeKey' => 'ru.mistake_key',
];Then, return [
'mistakeKey' => 'Example.mistakeKey',
'nullableKey' => 'Example.nullableKey',
'numericKey' => 'Example.numericKey',
'status' => [
'error' => 'Example.status.error',
'done' => 'Example.status.done',
'critical' => 'Example.status.critical',
],
'title' => 'Example.title',
];That is, deleted keys are gone. |
kenjis
commented
Aug 1, 2024
If return [
'title' => 'Default title',
'status' => [
'error' => 'Error!',
'done' => 'Done!',
'critical' => 'Critical!',
],
'nullableKey' => null,
'numericKey' => 100500,
'more' => [
'nested' => [
'key' => 'More nested key...',
],
],
];Then, return [
'more' => [
'nested' => [
'key' => 'Example.more.nested.key',
],
],
'nullableKey' => 'Example.nullableKey',
'numericKey' => 'Example.numericKey',
'status' => [
'error' => 'Example.status.error',
'done' => 'Example.status.done',
'critical' => 'Example.status.critical',
],
'title' => 'Example.title',
];That is, the key order changed. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
kenjis
commented
Aug 1, 2024
This command would be useful. |
neznaika0
commented
Aug 1, 2024
No. Look at the order of the files. We from EN combine RU. There are translations in RU
Yes. The order has changed. I'm sorting a new array. I think it can be fixed. But the keys will be chaotic when combined. |
kenjis
commented
Aug 2, 2024
This PR branch is too old. Can you rebase? |
kenjis
commented
Aug 2, 2024
Okay, I got what you say.
return [
'title' => 'Default title',
'status' => [
'error' => 'Error!',
'done' => 'Done!',
'critical' => 'Critical!',
],
'nullableKey' => null,
'numericKey' => 100500,
'more' => [
'nested' => [
'key' => 'More nested key...',
],
],
];
<?phpreturn [
// Deleted keys// 'more' => [// 'nested' => [// 'key' => 'Example.more.nested.key',// ],// ],'nullableKey' => null,
'numericKey' => 100000,
'status' => [
'error' => 'ru.status.error',
'done' => 'ru.status.done',
'critical' => 'ru.status.critical',
],
'title' => 'ru.title',
'mistakeKey' => 'ru.mistake_key',
];$ php spark lang:sync --locale en --target ru
$ composer cs-fix
return [
'more' => [
'nested' => [
'key' => 'Example.more.nested.key',
],
],
'nullableKey' => null,
'numericKey' => 100000,
'status' => [
'error' => 'ru.status.error',
'done' => 'ru.status.done',
'critical' => 'ru.status.critical',
],
'title' => 'ru.title',
]; |
kenjis
commented
Aug 2, 2024
I think the key order should not be changed. Can't you rewrite with recursive calls? <?phpfunctionsyncTranslationsRecursive($original, $translations) {
// Initialize an array to store the results$syncedTranslations = [];
// Loop through the original message arrayforeach ($originalas$key => $message) {
if (is_array($message)) {
// If the message is an array, recursively synchronize it$syncedTranslations[$key] = syncTranslationsRecursive(
$message,
array_key_exists($key, $translations) ? $translations[$key] : []
);
} else {
// If the message is not an array, check if the translations array contains the same keyif (array_key_exists($key, $translations)) {
$syncedTranslations[$key] = $translations[$key];
} else {
// If the key doesn't exist in the translations array, set an empty string$syncedTranslations[$key] = '';
}
}
}
return$syncedTranslations;
}
// Original message array$original = [
'title' => 'Default title',
'status' => [
'error' => 'Error!',
'done' => 'Done!',
'critical' => 'Critical!',
],
'more' => [
'nested' => [
'key' => 'More nested key...',
],
],
];
// Translated message array (partially translated)$translations = [
'title' => 'Título predeterminado',
'status' => [
'error' => '¡Error!',
'done' => '¡Hecho!',
],
];
// Synchronize the translations array with the original message array$syncedTranslations = syncTranslationsRecursive($original, $translations);
// Print the resultsprint_r($syncedTranslations); |
neznaika0
commented
Aug 2, 2024
What is the disadvantage of the current array merge? I can just remove the sorting and everything looks like you wanted. But, if the target file has keys, then they are added to the end. |
kenjis
commented
Aug 2, 2024
I would like the key order is never changed in any case. |
Results based on the data above: // translation RU is emptyreturn [
'title' => 'Example.title',
'status' => [
'error' => 'Example.status.error',
'done' => 'Example.status.done',
'critical' => 'Example.status.critical',
],
'nullableKey' => 'Example.nullableKey',
'numericKey' => 'Example.numericKey',
'more' => [
'nested' => [
'key' => 'Example.more.nested.key',
],
],
];// translation RU existreturn [
'nullableKey' => null,
'numericKey' => 100000,
'status' => [
'error' => 'ru.status.error',
'done' => 'ru.status.done',
'critical' => 'ru.status.critical',
],
'title' => 'ru.title',
'more' => [
'nested' => [
'key' => 'Example.more.nested.key',
],
],
]; |
kenjis
commented
Aug 5, 2024
When translation RU exist, the key order will be different from EN. |
neznaika0
commented
Aug 8, 2024
// Before: app/Language/en/Example.phpreturn [
'title' => 'Default title',
'status' => [
'error' => 'Error!',
'done' => 'Done!',
'critical' => 'Critical!',
],
'nullableKey' => null,
'array' => [],
'numericKey' => 100500,
'more' => [
'nested' => [
'key' => 'More nested key...',
],
],
];// Before: app/Language/ru/Example.phpreturn [
// Deleted keys// 'more' => [// 'nested' => [// 'key' => 'Example.more.nested.key',// ],// ],'nullableKey' => null,
'status' => [
'critical' => 'ru.status.critical',
'done' => 'ru.status.done',
'error' => 'ru.status.error',
],
'mistakeKey' => 'ru.mistake_key',
'numericKey' => 100000,
'title' => 'ru.title',
];// After: app/Language/ru/Example.php// 1. Right sort as in EN// 2. Delete 'mistakeKey' (in EN language not exist)// 3. Untranslated keys have a placeholder ''Example.more.nested.key'// 4. Previously translated keys are savedreturn [
'title' => 'ru.title',
'status' => [
'error' => 'ru.status.error',
'done' => 'ru.status.done',
'critical' => 'ru.status.critical',
],
'nullableKey' => null,
'array' => [
],
'numericKey' => 100000,
'more' => [
'nested' => [
'key' => 'Example.more.nested.key',
],
],
];The array intersection search function |
I prefer the following result. To make it easier for the developer to translate the file. // After: app/Language/ru/Example.phpreturn [
'title' => '(To be translated) Default title',
'status' => [
'error' => '(To be translated) Error!',
'done' => '(To be translated) Done!',
'critical' => '(To be translated) Critical!',
],
'nullableKey' => null,
'array' => [
],
'numericKey' => 100000,
'more' => [
'nested' => [
'key' => '(To be translated) More nested key...',
],
],
]; |
Uh oh!
There was an error while loading. Please reload this page.
@datamweb I think it's wrong. If the current locale is RU and the translations are the same (EN), it is unclear on the page whether the translation was made or not. Because the fallback translation is EN. Additional text interferes with the preview of the page (too long for some places). Placeholders clearly show untranslated lines. It is possible to make it configurable |
6bc2c49 to
435d8d6Comparemichalsn
commented
Dec 21, 2024
Okay, what is the status of this feature? It seems like the order of the keys is updated. Personally, I don't think we need the Are there any remaining issues? |
neznaika0
commented
Dec 21, 2024
I'll update the PR in a week. From the corrections: Checking the value is a string. In general, we can abandon PR, since I have a separate repository for |
michalsn
commented
Dec 21, 2024
So you would rather add this function to the existing |
neznaika0
commented
Dec 22, 2024
If this command is not needed in CI4, I can add it to the optional package. |
435d8d6 to
6872fa5CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
20cdcb7 to
47a6f8aCompareReady.
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
neznaika0
commented
Jan 11, 2025
Thanks to everyone who helps. |
samsonasik
commented
Jan 11, 2025
Thank you @neznaika0 |


Description
A simple command to copy existing translation files to a new locale.
From the file Language/en/Example.php:
After the command
php spark lang:sync --locale en --target ruwe get Language/ru/Example.php .applied
cs-fix:And so it is with all other translations
=====
When there are translations in the target folder Language/ru, their keys are saved only if they exist in the Language/en folder:
Language/ru/Example.php:
Language/ru/Example.php after sync:
Checklist: