<?php

class UOJLocale {
	public static $supported_locales = array('zh-cn', 'en');
	public static $supported_modules = array('basic', 'contests', 'problems', 'time');
	public static $data = array();
	public static $required = array();
	
	public static function locale() {
		$locale = Cookie::get('uoj_locale');
		if ($locale != null && !in_array($locale, self::$supported_locales)) {
			$locale = null;
			Cookie::unsetVar('uoj_locale', '/');
		}
		if ($locale == null) {
			$locale = 'zh-cn';
		}
		return $locale;
	}
	public static function setLocale($locale) {
		if (!in_array($locale, self::$supported_locales)) {
			return false;
		}
		return Cookie::set('uoj_locale', $locale, time() + 60 * 60 * 24 * 365 * 10, '/');
	}
	public static function requireModule($name) {
		if (in_array($name, self::$required)) {
			return;
		}
		$required[] = $name;
		$data = include($_SERVER['DOCUMENT_ROOT'].'/app/locale/'.$name.'/'.self::locale().'.php');
		
		$pre = $name == 'basic' ? '' : "$name::";
		foreach ($data as $key => $val) {
			self::$data[$pre.$key] = $val;
		}
	}
	public static function get($name) {
		if (!isset(self::$data[$name])) {
			$module_name = strtok($name, '::');
			if (!in_array($module_name, self::$supported_modules)) {
				return false;
			}
			self::requireModule($module_name);
		}
		if (!isset(self::$data[$name])) {
			return false;
		}
		if (is_string(self::$data[$name])) {
			return self::$data[$name];
		} else {
			return call_user_func_array(self::$data[$name], array_slice(func_get_args(), 1));
		}
	}
}