123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- <?php namespace Laravel;
- 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 [$bundle][$language][$file].
- *
- * @var array
- */
- protected static $lines = array();
- /**
- * The language loader event name.
- *
- * @var string
- */
- const loader = 'laravel.language.loader';
- /**
- * 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 = (array) $replacements;
- }
- /**
- * Create a new language line instance.
- *
- * <code>
- * // Create a new language line instance for a given line
- * $line = Lang::line('validation.required');
- *
- * // Create a new language line for a line belonging to a bundle
- * $line = Lang::line('admin::messages.welcome');
- *
- * // 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::get('application.language');
- return new static($key, $replacements, $language);
- }
- /**
- * Determine if a language line exists.
- *
- * @param string $key
- * @param string $language
- * @return bool
- */
- public static function has($key, $language = null)
- {
- return static::line($key, array(), $language)->get() !== $key;
- }
- /**
- * Get the language line as a string.
- *
- * <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')->get(null, 'Default');
- * </code>
- *
- * @param string $language
- * @param string $default
- * @return string
- */
- public function get($language = null, $default = null)
- {
- // If no default value is specified by the developer, we'll just return the
- // key of the language line. This should indicate which language line we
- // were attempting to render and is better than giving nothing back.
- if (is_null($default)) $default = $this->key;
- if (is_null($language)) $language = $this->language;
- list($bundle, $file, $line) = $this->parse($this->key);
- // If the file does not exist, we'll just return the default value that was
- // given to the method. The default value is also returned even when the
- // file exists and that file does not actually contain any lines.
- if ( ! static::load($bundle, $language, $file))
- {
- return value($default);
- }
- $lines = static::$lines[$bundle][$language][$file];
- $line = array_get($lines, $line, $default);
- // If the line is not a string, it probably means the developer asked for
- // the entire language file and the value of the requested value will be
- // an array containing all of the lines in the file.
- if (is_string($line))
- {
- foreach ($this->replacements as $key => $value)
- {
- $line = str_replace(':'.$key, $value, $line);
- }
- }
- return $line;
- }
- /**
- * Parse a language key into its bundle, file, and line segments.
- *
- * Language lines follow a {bundle}::{file}.{line} naming convention.
- *
- * @param string $key
- * @return array
- */
- protected function parse($key)
- {
- $bundle = Bundle::name($key);
- $segments = explode('.', Bundle::element($key));
- // If there are not at least two segments in the array, it means that
- // the developer is requesting the entire language line array to be
- // returned. If that is the case, we'll make the item "null".
- if (count($segments) >= 2)
- {
- $line = implode('.', array_slice($segments, 1));
- return array($bundle, $segments[0], $line);
- }
- else
- {
- return array($bundle, $segments[0], null);
- }
- }
- /**
- * Load all of the language lines from a language file.
- *
- * @param string $bundle
- * @param string $language
- * @param string $file
- * @return bool
- */
- public static function load($bundle, $language, $file)
- {
- if (isset(static::$lines[$bundle][$language][$file]))
- {
- return true;
- }
- // We use a "loader" event to delegate the loading of the language
- // array, which allows the develop to organize the language line
- // arrays for their application however they wish.
- $lines = Event::first(static::loader, func_get_args());
- static::$lines[$bundle][$language][$file] = $lines;
- return count($lines) > 0;
- }
- /**
- * Load a language array from a language file.
- *
- * @param string $bundle
- * @param string $language
- * @param string $file
- * @return array
- */
- public static function file($bundle, $language, $file)
- {
- $lines = array();
- // Language files can belongs to the application or to any bundle
- // that is installed for the application. So, we'll need to use
- // the bundle's path when looking for the file.
- $path = static::path($bundle, $language, $file);
- if (file_exists($path))
- {
- $lines = require $path;
- }
- return $lines;
- }
- /**
- * Get the path to a bundle's language file.
- *
- * @param string $bundle
- * @param string $language
- * @param string $file
- * @return string
- */
- protected static function path($bundle, $language, $file)
- {
- return Bundle::path($bundle)."language/{$language}/{$file}".EXT;
- }
- /**
- * Get the string content of the language line.
- *
- * @return string
- */
- public function __toString()
- {
- return (string) $this->get();
- }
- }
|