<?php
/**
* Provides iteration over all installed files for a given language and matches them to bundles
*/
class Loco_package_Locale {
/**
* @var array
*/
private $match;
/**
* @var array
*/
private $bundles;
/**
* Maps file paths to projects in which they were found
* @var ArrayObject
*/
private $index;
/**
* Construct with locale to filter on
* @param Loco_Locale|null
*/
public function __construct( Loco_locale $locale = null ){
$this->index = new ArrayObject;
$this->match = [];
if( $locale ){
$this->addLocale( $locale );
}
}
/**
* Add another locale to search on
* @param Loco_Locale
* @return Loco_package_Locale
*/
public function addLocale( Loco_Locale $locale ){
if( $locale->isValid() ){
$sufx = (string) $locale.'.po';
$this->match[$sufx] = - strlen($sufx);
}
return $this;
}
/**
* @param Loco_fs_File
* @return Loco_package_Project|null
*/
public function getProject( Loco_fs_File $file ){
$path = $file->getPath();
if( isset($this->index[$path]) ){
return $this->index[$path];
}
return null;
}
/**
* @return Loco_package_Bundle[]
*/
public function getBundles(){
$bundles = $this->bundles;
if( ! $bundles ){
$bundles = [ Loco_package_Core::create() ];
$bundles = array_merge( $bundles, Loco_package_Plugin::getAll() );
$bundles = array_merge( $bundles, Loco_package_Theme::getAll() );
$this->bundles = $bundles;
}
return $bundles;
}
/**
* @return loco_fs_FileList
*/
public function findLocaleFiles(){
$index = $this->index;
$suffixes = $this->match;
$list = new Loco_fs_FileList;
foreach( $this->getBundles() as $bundle ){
/* @var Loco_package_Project $project */
foreach( $bundle as $project ){
/* @var $file Loco_fs_File */
foreach( $project->findLocaleFiles('po') as $file ){
$path = $file->getPath();
foreach( $suffixes as $sufx => $snip ){
if( substr($path,$snip) === $sufx ){
$list->add( $file );
$index[$path] = $project;
break;
}
}
}
}
}
return $list;
}
/**
* @return loco_fs_FileList
*/
public function findTemplateFiles(){
$index = $this->index;
$list = new Loco_fs_FileList;
foreach( $this->getBundles() as $bundle ){
/* @var $project Loco_package_Project */
foreach( $bundle as $project ){
$file = $project->getPot();
if( $file && $file->exists() ){
$list->add( $file );
$path = $file->getPath();
$index[$path] = $project;
}
}
}
return $list;
}
}