Lemonldap-NG-Manager
view release on metacpan or search on metacpan
scripts/llng-build-manager-files view on Meta::CPAN
my $insert_after = $ext_spec->{insert_after};
my $insert_before = $ext_spec->{insert_before};
# Determine target array for insertion
my $target_array;
if ($insert_into) {
# Navigate to nested node using path (e.g., "oidcRPMetaDataOptions/oidcRPMetaDataOptionsAdvanced")
my @path_parts = split '/', $insert_into;
my $target =
find_tree_node( $core_ctrees->{$ctree_name}, \@path_parts );
unless ($target) {
warn
"Warning [$ext_file]: Could not find ctree path: $ctree_name/$insert_into\n";
return;
}
$target_array = $target->{nodes};
unless ($target_array) {
warn
"Warning [$ext_file]: Target node '$insert_into' has no 'nodes' array\n";
return;
}
}
else {
$target_array = $core_ctrees->{$ctree_name};
}
if ($insert_after) {
insert_nodes_after( $target_array, $insert_after, $nodes, $ext_file );
}
elsif ($insert_before) {
insert_nodes_before( $target_array, $insert_before, $nodes, $ext_file );
}
else {
push @$target_array, @$nodes;
}
verbose " Extended ctree: $ctree_name\n";
}
sub merge_constants {
my ( $core, $ext, $ext_file ) = @_;
for my $key ( keys %$ext ) {
if ( exists $core->{$key} ) {
die
"Error [$ext_file]: Portal constant '$key' already exists with value $core->{$key}\n";
}
my $value = $ext->{$key};
if ( $value >= 0 && $value < 200 ) {
warn
"Warning [$ext_file]: Plugin constants should use values >= 200 (got $key => $value)\n";
}
$core->{$key} = $value;
verbose " Added constant: $key => $value\n";
}
}
sub update_language_files {
my ( $dir, $translations ) = @_;
# List all language files
opendir my $dh, $dir or die "Cannot open language directory $dir: $!";
my @lang_files = grep { /\.json$/ } readdir $dh;
closedir $dh;
my $json =
JSON->new->utf8->pretty->canonical->space_before(0)->space_after(0);
for my $lang_file (@lang_files) {
my $lang_path = "$dir/$lang_file";
# Extract language code from filename (e.g., "fr.json" -> "fr")
my ($lang_code) = $lang_file =~ /^(.+)\.json$/;
# Load existing translations
my $content;
{
open my $fh, '<', $lang_path or die "Cannot read $lang_path: $!";
local $/;
$content = <$fh>;
close $fh;
}
my $lang_data = $json->decode($content);
# Add new translations
my $modified = 0;
for my $key ( keys %$translations ) {
my $trans = $translations->{$key};
# Determine the text to use:
# 1. Use the specific language if available
# 2. Fall back to English
# 3. Fall back to the first available language
my $text;
if ( ref($trans) eq 'HASH' ) {
$text = $trans->{$lang_code} // $trans->{en}
// ( values %$trans )[0];
}
else {
# If trans is a scalar, use it directly (same for all languages)
$text = $trans;
}
if ( defined $text ) {
if ( exists $lang_data->{$key} ) {
verbose " [$lang_code] Overriding existing key '$key'\n";
}
$lang_data->{$key} = $text;
$modified = 1;
}
}
# Write back if modified
if ($modified) {
$content = $json->encode($lang_data);
# Compact format like addTrEntry
$content =~ s/\n\s+/\n/sg;
( run in 0.978 second using v1.01-cache-2.11-cpan-e93a5daba3e )