diff --git a/libraries/config/config_functions.lib.php b/libraries/config/config_functions.lib.php
new file mode 100644
index 000000000..b0fa9fd32
--- /dev/null
+++ b/libraries/config/config_functions.lib.php
@@ -0,0 +1,229 @@
+= 0; $depth--) {
+ if (!isset($path[$depth+1]) || count($path[$depth+1]) == 0) {
+ unset($path[$depth][$keys[$depth]]);
+ } else {
+ break;
+ }
+ }
+}
+
+/**
+ * Returns sanitized language string, taking into account our special codes
+ * for formatting. Takes variable number of arguments.
+ * Based on PMA_sanitize from sanitize.lib.php.
+ *
+ * @param string $lang_key key in $GLOBALS WITHOUT 'strSetup' prefix
+ * @param mixed $args arguments for sprintf
+ * @return string
+ */
+function PMA_lang($lang_key)
+{
+ static $search, $replace;
+
+ // some quick cache'ing
+ if ($search === null) {
+ $replace_pairs = array(
+ '<' => '<',
+ '>' => '>',
+ '[em]' => '',
+ '[/em]' => '',
+ '[strong]' => '',
+ '[/strong]' => '',
+ '[code]' => '',
+ '[/code]' => '
',
+ '[kbd]' => '',
+ '[/kbd]' => '',
+ '[br]' => '
',
+ '[sup]' => '',
+ '[/sup]' => '');
+ if (defined('PMA_SETUP')) {
+ $replace_pairs['[a@Documentation.html'] = '[a@../Documentation.html';
+ }
+ $search = array_keys($replace_pairs);
+ $replace = array_values($replace_pairs);
+ }
+ $message = isset($GLOBALS["strSetup$lang_key"]) ? $GLOBALS["strSetup$lang_key"] : $lang_key;
+ $message = str_replace($search, $replace, $message);
+ // replace [a@"$1"]$2[/a] with $2
+ $message = preg_replace('#\[a@("?)([^\]]+)\1\]([^\[]+)\[/a\]#e',
+ "PMA_lang_link_replace('$2', '$3')", $message);
+
+ if (func_num_args() == 1) {
+ return $message;
+ } else {
+ $args = func_get_args();
+ array_shift($args);
+ return vsprintf($message, $args);
+ }
+}
+
+/**
+ * Returns translated field name
+ *
+ * @param string $canonical_path
+ * @return string
+ */
+function PMA_lang_name($canonical_path)
+{
+ $lang_key = str_replace(
+ array('Servers/1/', '/'),
+ array('Servers/', '_'),
+ $canonical_path) . '_name';
+ return isset($GLOBALS["strSetup$lang_key"])
+ ? $GLOBALS["strSetup$lang_key"]
+ : $lang_key;
+}
+
+/**
+ * Returns translated field description
+ *
+ * @param string $canonical_path
+ * @return string
+ */
+function PMA_lang_desc($canonical_path)
+{
+ $lang_key = str_replace(
+ array('Servers/1/', '/'),
+ array('Servers/', '_'),
+ $canonical_path) . '_desc';
+ return isset($GLOBALS["strSetup$lang_key"])
+ ? PMA_lang($lang_key)
+ : '';
+}
+
+/**
+ * Wraps link in <a> tags and replaces argument separator in internal links
+ * to the one returned by PMA_get_arg_separator()
+ *
+ * @param string $link
+ * @param string $text
+ * @return string
+ */
+function PMA_lang_link_replace($link, $text)
+{
+ static $separator;
+
+ if (!isset($separator)) {
+ $separator = PMA_get_arg_separator('html');
+ }
+
+ if (!preg_match('#^http://#', $link)) {
+ $link = str_replace('&', $separator, $link);
+ }
+
+ return '' . $text . '';
+}
+
+/**
+ * Reads user preferences field names
+ *
+ * @param array|null $forms
+ * @return array
+ */
+function PMA_read_userprefs_fieldnames(array $forms = null)
+{
+ static $names;
+
+ // return cached results
+ if ($names !== null) {
+ return $names;
+ }
+ if (is_null($forms)) {
+ $forms = array();
+ include 'libraries/config/user_preferences.forms.php';
+ }
+ $names = array();
+ foreach ($forms as $formset) {
+ foreach ($formset as $form) {
+ foreach ($form as $k => $v) {
+ $names[] = is_int($k) ? $v : $k;
+ }
+ }
+ }
+ return $names;
+}
+?>
\ No newline at end of file