user()->language) . ' ' . $suffix[$base]; } } if (!function_exists('join_paths')) { function join_paths(string $base, string ...$paths): string { if ($base === '/') { return str_replace('//', '', implode('/', $paths)); } return str_replace('//', '', $base . '/' . implode('/', $paths)); } } if (!function_exists('resolve_path')) { function resolve_path(string $path): string { $parts = array_filter(explode('/', $path), fn (string $p) => strlen($p) > 0); $absolutes = []; foreach ($parts as $part) { if ($part == '.') { continue; } if ($part == '..') { array_pop($absolutes); } else { $absolutes[] = $part; } } return implode('/', $absolutes); } }