diff --git a/api/LocaleAPI.php b/api/LocaleAPI.php
new file mode 100755
index 000000000..26cdbead6
--- /dev/null
+++ b/api/LocaleAPI.php
@@ -0,0 +1,170 @@
+
";
+
+ //Calculate base directory
+ $baseDir = Director::baseFolder();
+
+ //Search for and process existent modules, or use the passed one instead
+ if (!isset($_GET['module'])) {
+ $topLevel = scandir($baseDir);
+ foreach($topLevel as $module) {
+ LocaleAPI::processModule($baseDir, $module);
+ }
+ } else {
+ LocaleAPI::processModule($baseDir, $_GET['module']);
+ }
+
+ echo "Done!";
+
+ }
+
+ private static function processModule($baseDir, $module) {
+ if(is_dir("$baseDir/$module") && !in_array($module, array('sapphire','jsparty','assets')) && substr($module,0,1) != '.') {
+ LocaleAPI::getFilesRec("$baseDir/$module/code", $fileList);
+ foreach($fileList as $index => $file) {
+ $mst .= LocaleAPI::reportCallsCode($index, $file);
+ }
+ $fileList = NULL;
+ LocaleAPI::getFilesRec("$baseDir/$module/templates", $fileList);
+ foreach($fileList as $index => $file) {
+ $mst .= LocaleAPI::reportCallsTpl($index, $file);
+ }
+ if ($mst) {
+ // Create folder for lang files
+ $langFolder = $baseDir . '/' . $module . '/lang';
+ if(!file_exists($baseDir. '/' . $module . '/lang')) {
+ mkdir($langFolder);
+ }
+
+ // Open the English file and write the Master String Table
+ if($fh = fopen($langFolder . '/en.php', "w")) {
+ fwrite($fh, "");
+ fclose($fh);
+ echo "Created file: $langFolder/en.php
";
+
+ } else {
+ die("Cannot write language file! Please check permissions of $langFolder/en.php");
+ }
+ }
+ }
+ }
+
+ private static function getFilesRec($folder, &$fileList) {
+ $items = scandir($folder);
+ if($items) foreach($items as $item) {
+ if(substr($item,0,1) == '.') continue;
+ if(substr($item,-4) == '.php') $fileList[substr($item,0,-4)] = "$folder/$item";
+ else if(substr($item,-3) == '.ss') $fileList[$item] = "$folder/$item";
+ else if(is_dir("$folder/$item")) LocaleAPI::getFilesRec("$folder/$item", $fileList);
+ }
+ }
+
+ /**
+ * Look for calls to the underscore function and build our MST
+ */
+ private static function reportCallsCode($index, $file) {
+ static $callMap;
+ $content = file_get_contents($file);
+ while (ereg('_\(([^$][^,"\']*|"[^,]*"|\'[^,]*\')(,[^$][^,]*)(,[^$][^,)]*)(,[^,)]*)?(,[^)]*)?\)',$content,$regs)) {
+
+ $class = ($regs[1] == '__FILE__' ? $index : $regs[1]);
+ $entity = substr($regs[2],2,-1);
+
+ if ($callMap[$class.'--'.$entity]) echo "Warning! Redeclaring entity $entity in file $file
";
+
+ $mst .= '$lang[\'en\'][\'' . $class . '\'][\'' . substr($regs[2],2,-1) . '\'] = ';
+ if ($regs[4]) {
+ $mst .= "array(\n\t'" . substr($regs[3],2,-1) . "',\n\t" . substr($regs[4],1);
+ if ($regs[5]) $mst .= ",\n\t'" . substr($regs[5],2,-1) . '\'';
+ $mst .= "\n);";
+ } else $mst .= '\'' . substr($regs[3],2,-1) . '\';';
+ $mst .= "\n";
+ $content = str_replace($regs[0],"",$content);
+
+ $callMap[$class.'--'.$entity] = $regs[3];
+ }
+
+ return $mst;
+ }
+
+ /**
+ * Look for calls to the underscore function and build our MST
+ * Template version - no "class" argument
+ */
+ private static function reportCallsTpl($index, $file) {
+ static $callMap;
+ $content = file_get_contents($file);
+ while (ereg('_\(([^$][^,"\']*|"[^,]*"|\'[^,]*\')(,[^$][^,)]*)(,[^,)]*)?(,[^)]*)?\)',$content,$regs)) {
+
+ $entity = substr($regs[1],2,-1);
+
+ if ($callMap[$index.'--'.$entity]) echo "Warning! Redeclaring entity $entity in file $file
";
+
+ $mst .= '$lang[\'en\'][\'' . $index . '\'][\'' . substr($regs[1],1,-1) . '\'] = ';
+ if ($regs[3]) {
+ $mst .= "array(\n\t'" . substr($regs[2],2,-1) . "',\n\t" . substr($regs[3],1);
+ if ($regs[4]) $mst .= ",\n\t'" . substr($regs[4],2,-1) . '\'';
+ $mst .= "\n);";
+ } else $mst .= '\'' . substr($regs[2],2,-1) . '\';';
+ $mst .= "\n";
+ $content = str_replace($regs[0],"",$content);
+
+ $callMap[$index.'--'.$entity] = $regs[3];
+ }
+
+ return $mst;
+ }
+
+ static function setLocale($locale) {
+ if ($locale) LocaleAPI::$currentlocale = $locale;
+ }
+ static function getLocale() {
+ return LocaleAPI::$currentlocale;
+ }
+
+ /**
+ * Includes all available language files for a certain defined locale
+ */
+ static function includeByLocale($locale) {
+ $topLevel = scandir(Director::baseFolder());
+ foreach($topLevel as $module) {
+ if (file_exists($file = Director::getAbsFile("$module/lang/$locale.php"))) {
+ include_once($file);
+ }
+ }
+ }
+
+ /**
+ * Given a class name (a "locale namespace"), will search for its module and, if available,
+ * will load the resources for the currently defined locale.
+ * If not available, the original english resource will be loaded instead (to avoid blanks)
+ */
+ static function includeByClass($class) {
+ if (substr($class,-3) == '.ss') {
+ global $_TEMPLATE_MANIFEST;
+ $path = current($_TEMPLATE_MANIFEST[substr($class,0,-3)]);
+ ereg('.*/([^/]+)/templates/',$path,$module);
+ }
+ else {
+ global $_CLASS_MANIFEST;
+ $path = $_CLASS_MANIFEST[$class];
+ ereg('.*/([^/]+)/code/',$path,$module);
+ }//die($class);
+ if (file_exists($file = Director::getAbsFile("{$module[1]}/lang/". LocaleAPI::getLocale() . '.php'))) {
+ include_once($file);
+ } else if (LocaleAPI::getLocale() != 'en') {
+ LocaleAPI::setLocale('en');
+ LocaleAPI::includeByClass($class);
+ } else {
+ user_error("Locale file $file should exist", E_USER_WARNING);
+ }
+ }
+}
+
+?>
\ No newline at end of file