Mini Shell
#!/usr/local/cpanel/3rdparty/bin/perl
# Copyright 2024 WebPros International, LLC
# All rights reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited.
use strict;
use warnings;
use Getopt::Param ();
use Cpanel::Locale ();
use Cpanel::Locale::Utils::Display ();
use Cpanel::Locale::Utils::XML ();
use Cpanel::SafeDir::MK ();
my $prm = Getopt::Param->new(
{
'no_args_help' => 1,
'help_coderef' => sub {
print <<"END_USAGE";
$0 --locale={locale_tag} [--locale=… --locale=… …] [--quiet] [--export-{locale_tag}={path}] [--dumper-format] [--exclude-bracketed-strings] [--no-fallback]
Export locales from the Locale database in XML format.
Options:
--help Show this help screen.
--quiet Show less status output than normal. This also suppresses warnings related to locale string syntax.
--locale={locale_tag} Specify a locale to export. You may pass the flag multiple times in order to export multiple locales.
This creates files in a default location that `/usr/local/cpanel/scripts/locale_import --locale={locale_tag}` knows to use.
--export-{locale_tag}={file} Save the export of the locale {locale_tag} to {file} instead of the standard place.
This creates files that can be imported with `/usr/local/cpanel/scripts/locale_import --import={file}`
--dumper-format Export into the old format instead of XLIFF (will force an .xml extension on any --export-XX paths)
--recover Try to recover on encountering an ill-formed phrase.
--exclude-bracketed-strings Exclude strings that contain bracket notation, which may cause problems on some translation platforms.
--no-fallback Do not use original strings as fallback. If no translation is available, leave target blank.
The XML files that this script creates can be imported via /usr/local/cpanel/scripts/locale_import
If there were problems exporting the script will exit with an error status. To examine the details of what happened do not use --quiet.
END_USAGE
exit;
},
}
);
my $verbose = $prm->get_param('quiet') ? 0 : 1;
my $options = {
'recover' => ( $prm->get_param('recover') ? 1 : 0 ),
'no-brackets' => ( $prm->get_param('exclude-bracketed-strings') ? 1 : 0 ),
'no-fallback' => ( $prm->get_param('no-fallback') ? 1 : 0 ),
'no-warn' => ( $verbose ? 0 : 1 ),
};
my $count = 0;
my $failed = 0;
my $locale = Cpanel::Locale->get_handle();
my %locale_lookup;
@locale_lookup{ Cpanel::Locale::Utils::Display::get_locale_list($locale) } = ();
my $euid_home;
foreach my $loc ( $prm->get_param('locale') ) {
$count++;
if ( !exists $locale_lookup{$loc} ) {
print "Invalid locale\n" if $verbose;
$failed++;
next;
}
my $path = $prm->get_param('dumper-format') ? "/var/cpanel/locale/export/$loc.xml" : "/var/cpanel/locale/export/$loc.xlf";
if ( $prm->get_param("export-$loc") ) {
$path = $prm->get_param("export-$loc");
$path =~ s/\.[^.]+$//; # strip any existing extension …
if ( $prm->get_param('dumper-format') ) {
$path .= '.xml'; # … replace it w/ .xml
}
else {
$path .= '.xlf'; # … replace it w/ .xlf
}
}
# expand ~/ that was treated as a string and not expanded by the shell before being put in @ARGV
if ( substr( $path, 0, 2 ) eq '~/' ) {
$euid_home ||= ( getpwuid($>) )[7]; # only look it up if needed, and only look it up one time
substr( $path, 0, 2, "$euid_home/" );
}
my ( $head, @dir ) = reverse( split( /\//, $path ) );
my $dir = join( '/', reverse(@dir) );
if ( $dir && !-d $dir ) {
if ( !Cpanel::SafeDir::MK::safemkdir($dir) ) {
print "Could not create path '$dir': $!\n" if $verbose;
$failed++;
next;
}
}
if ( -e $path ) {
print "Replacing existing export file '$path'\n" if $verbose;
unlink($path);
if ( -e $path ) {
print "Could not unlink '$path': $!\n" if $verbose;
$failed++;
next;
}
}
my $error = '';
if ( Cpanel::Locale::Utils::XML::locale_to_xml( $path, $loc, \$error, $options ) ) {
print "$error'$loc' has been exported to '$path'.\n" if $verbose;
}
else {
print "Failed to create XML file for locale '$loc': $error\n" if $verbose;
$failed++;
next;
}
}
if ( !$count || $failed ) {
if ($verbose) {
if ($failed) {
print "$failed out of $count failed to export.\n";
}
elsif ( !$count ) {
print "No locales to export.\n";
}
}
exit 1;
}
Zerion Mini Shell 1.0