2017-04-25 09:01:34 +00:00
< ? php
/**
2024-05-10 13:09:14 +00:00
* SPDX - FileCopyrightText : 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2017-04-25 09:01:34 +00:00
*/
$directories = [
__DIR__ . '/../core/l10n' ,
];
2022-06-07 15:09:46 +00:00
$isDebug = in_array ( '--debug' , $argv , true ) || in_array ( '-d' , $argv , true );
2024-08-20 14:45:12 +00:00
$txConfig = file_get_contents ( __DIR__ . '/../.tx/config' );
$untranslatedApps = [
'testing' ,
];
2024-09-18 09:03:13 +00:00
// Next line only looks messed up, but it works. Don't touch it!
$rtlCharacters = [
'\x{061C}' , // ARABIC LETTER MARK
'\x{0623}' , // ARABIC LETTER ALEF WITH HAMZA ABOVE
'\x{200E}' , // LEFT-TO-RIGHT MARK
'\x{200F}' , // RIGHT-TO-LEFT MARK
'\x{202A}' , // LEFT-TO-RIGHT EMBEDDING
'\x{202B}' , // RIGHT-TO-LEFT EMBEDDING
'\x{202C}' , // POP DIRECTIONAL FORMATTING
'\x{202D}' , // LEFT-TO-RIGHT OVERRIDE
'\x{202E}' , // RIGHT-TO-LEFT OVERRIDE
'\x{2066}' , // LEFT-TO-RIGHT ISOLATE
'\x{2067}' , // RIGHT-TO-LEFT ISOLATE
'\x{2068}' , // FIRST STRONG ISOLATE
'\x{2069}' , // POP DIRECTIONAL ISOLATE
'\x{206C}' , // INHIBIT ARABIC FORM SHAPING
'\x{206D}' , // ACTIVATE ARABIC FORM SHAPING
];
$rtlLanguages = [
'ar' , // Arabic
'fa' , // Persian
'he' , // Hebrew
'ps' , // Pashto,
'ug' , // 'Uyghurche / Uyghur
'ur_PK' , // Urdu
];
2024-08-20 14:45:12 +00:00
$valid = 0 ;
$errors = [];
2017-04-25 12:35:51 +00:00
$apps = new \DirectoryIterator ( __DIR__ . '/../apps' );
foreach ( $apps as $app ) {
2024-08-20 14:45:12 +00:00
if ( $app -> isDot () || in_array ( $app -> getBasename (), $untranslatedApps , true )) {
continue ;
}
2017-04-25 12:35:51 +00:00
if ( ! file_exists ( $app -> getPathname () . '/l10n' )) {
2024-08-20 14:45:12 +00:00
if ( ! str_contains ( $txConfig , '[o:nextcloud:p:nextcloud:r:' . $app -> getBasename () . ']' )) {
$errors [] = $app -> getBasename () . " \n " . ' App is not translation synced via transifex and also not marked as untranslated' . " \n " ;
}
2017-04-25 12:35:51 +00:00
continue ;
}
$directories [] = $app -> getPathname () . '/l10n' ;
}
2017-04-25 09:01:34 +00:00
foreach ( $directories as $dir ) {
if ( ! file_exists ( $dir )) {
continue ;
}
$directory = new \DirectoryIterator ( $dir );
foreach ( $directory as $file ) {
if ( $file -> getExtension () !== 'json' ) {
continue ;
}
$content = file_get_contents ( $file -> getPathname ());
2024-09-18 09:03:13 +00:00
$language = pathinfo ( $file -> getFilename (), PATHINFO_FILENAME );
2024-10-23 07:39:57 +00:00
if ( ! in_array ( $language , $rtlLanguages , true ) && preg_match_all ( '/^(.+[' . implode ( '' , $rtlCharacters ) . '].+)$/mu' , $content , $matches )) {
$errors [] = $file -> getPathname () . " \n " . ' ' . 'Contains a RTL limited characters in the translations. Offending strings:' . " \n " . implode ( " \n " , $matches [ 0 ]) . " \n " ;
2024-09-18 09:03:13 +00:00
}
2017-04-25 09:01:34 +00:00
$json = json_decode ( $content , true );
2021-03-30 18:19:41 +00:00
$translations = json_encode ( $json [ 'translations' ]);
2021-04-01 09:12:00 +00:00
if ( strpos ( $translations , '|' ) !== false ) {
2022-06-07 15:09:46 +00:00
$errors [] = $file -> getPathname () . " \n " . ' ' . 'Contains a | in the translations.' . " \n " ;
2021-03-30 18:19:41 +00:00
}
2017-04-25 09:01:34 +00:00
if ( json_last_error () !== JSON_ERROR_NONE ) {
$errors [] = $file -> getPathname () . " \n " . ' ' . json_last_error_msg () . " \n " ;
} else {
2020-07-14 20:05:11 +00:00
$valid ++ ;
2017-04-25 09:01:34 +00:00
}
2022-06-07 15:09:46 +00:00
if ( $isDebug && $file -> getFilename () === 'en_GB.json' ) {
$sourceStrings = json_encode ( array_keys ( $json [ 'translations' ]));
if ( strpos ( $sourceStrings , '\u2019' ) !== false ) {
$errors [] = $file -> getPathname () . " \n "
. ' ' . 'Contains a unicode single quote "’ " in the english source string, please replace with normal single quotes.' . " \n "
. ' ' . 'Please note that this only updates after a sync to transifex.' . " \n " ;
}
}
2017-04-25 09:01:34 +00:00
}
}
if ( count ( $errors ) > 0 ) {
2024-08-20 14:45:12 +00:00
echo " \033 [0;31m " . sprintf ( 'ERROR: There were %d errors:' , count ( $errors )) . " \033 [0m \n \n " ;
2020-07-14 20:05:11 +00:00
echo implode ( " \n " , $errors );
2017-04-25 09:01:34 +00:00
exit ( 1 );
}
2024-08-20 14:45:12 +00:00
echo " \033 [0;32m " . 'OK: ' . $valid . ' files parse' . " \033 [0m \n " ;
2017-04-25 09:01:34 +00:00
exit ( 0 );