| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | <?php namespace Laravel; use Closure;class Lang {	/**	 * The key of the language line being retrieved.	 *	 * @var string	 */	protected $key;	/**	 * The replacements that should be made on the language line.	 *	 * @var array	 */	protected $replacements;	/**	 * The language in which the line should be retrieved.	 *	 * @var string	 */	protected $language;	/**	 * All of the loaded language lines.	 *	 * The array is keyed by [$language][$file].	 *	 * @var array	 */	protected static $lines = array();	/**	 * Create a new Lang instance.	 *	 * @param  string  $key	 * @param  array   $replacements	 * @param  string  $language	 * @return void	 */	protected function __construct($key, $replacements = array(), $language = null)	{		$this->key = $key;		$this->language = $language;		$this->replacements = $replacements;	}	/**	 * Create a new language line instance.	 *	 * <code>	 *		// Create a new language line instance for a given line	 *		$line = Lang::line('validation.required');	 *	 *		// Specify some replacements for the language line	 *		$line = Lang::line('validation.required', array('attribute' => 'email'));	 * </code>	 *	 * @param  string  $key	 * @param  array   $replacements	 * @param  string  $language	 * @return Lang	 */	public static function line($key, $replacements = array(), $language = null)	{		if (is_null($language))		{			$language = Config::$items['application']['language'];		}		return new static($key, $replacements, $language);	}	/**	 * Get the language line as a string.	 *	 * If a language is specified, it should correspond to a directory	 * within your application language directory.	 *	 * <code>	 *		// Get a language line	 *		$line = Lang::line('validation.required')->get();	 *	 *		// Get a language line in a specified language	 *		$line = Lang::line('validation.required')->get('sp');	 *	 *		// Return a default value if the line doesn't exist	 *		$line = Lang::line('validation.required', null, 'Default');	 * </code>	 *	 * @param  string  $language	 * @param  string  $default	 * @return string	 */	public function get($language = null, $default = null)	{		if (is_null($language)) $language = $this->language;		list($file, $line) = $this->parse($this->key);		if ( ! $this->load($file))		{			return ($default instanceof Closure) ? call_user_func($default) : $default;		}		return $this->replace(Arr::get(static::$lines[$language][$file], $line, $default));	}	/**	 * Make all necessary replacements on a language line.	 *	 * Replacements place-holder are prefixed with a colon, and are replaced	 * with the appropriate value based on the replacement array set for the	 * language line instance.	 *	 * @param  string  $line	 * @return string	 */	protected function replace($line)	{		foreach ($this->replacements as $key => $value)		{			$line = str_replace(':'.$key, $value, $line);		}		return $line;	}	/**	 * Parse a language key into its file and line segments.	 *	 * Language keys are formatted similarly to configuration keys. The first	 * segment represents the language file, while the second segment	 * represents a language line within that file.	 *	 * @param  string  $key	 * @return array	 */	protected function parse($key)	{		if (count($segments = explode('.', $key)) > 1)		{			return array($segments[0], implode('.', array_slice($segments, 1)));		}		throw new \InvalidArgumentException("Invalid language line [$key].");	}	/**	 * Load all of the language lines from a language file.	 *	 * If the language file is successfully loaded, true will be returned.	 *	 * @param  string  $file	 * @return bool	 */	protected function load($file)	{		if (isset(static::$lines[$this->language][$file])) return true;		$language = array();		if (file_exists($path = LANG_PATH.$this->language.'/'.$file.EXT))		{			$language = array_merge($language, require $path);		}		// If language lines were actually found, they will be loaded into		// the array containing all of the lines for all languages and files.		// The array is keyed by the language and the file name.		if (count($language) > 0)		{			static::$lines[$this->language][$file] = $language;		}				return isset(static::$lines[$this->language][$file]);			}	/**	 * Get the string content of the language line.	 */	public function __toString()	{		return $this->get();	}}
 |