mirror of
https://github.com/WenPai-org/wp-china-yes.git
synced 2025-08-08 14:59:18 +08:00
feat:3.0.0版初次提交,新版将完全推倒重写
This commit is contained in:
parent
e556c4b6d9
commit
39735249ee
293 changed files with 26908 additions and 475 deletions
78
vendor/loco-translate/src/admin/DebugController.php
vendored
Normal file
78
vendor/loco-translate/src/admin/DebugController.php
vendored
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
/**
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
class Loco_admin_DebugController extends Loco_mvc_AdminController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->set('title','DEBUG');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// debug package listener
|
||||
$themes = array();
|
||||
/* @var $bundle Loco_package_Bundle */
|
||||
foreach( Loco_package_Listener::singleton()->getThemes() as $bundle ){
|
||||
$themes[] = array (
|
||||
'id' => $bundle->getId(),
|
||||
'name' => $bundle->getName(),
|
||||
'default' => $bundle->getDefaultProject()->getSlug(),
|
||||
'count' => count($bundle),
|
||||
);
|
||||
}
|
||||
$this->set('themes', $themes );
|
||||
|
||||
$plugins = array();
|
||||
/* @var $bundle Loco_package_Bundle */
|
||||
foreach( Loco_package_Listener::singleton()->getPlugins() as $bundle ){
|
||||
$plugins[] = array (
|
||||
'id' => $bundle->getId(),
|
||||
'name' => $bundle->getName(),
|
||||
'default' => $bundle->getDefaultProject()->getSlug(),
|
||||
'count' => count($bundle),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// $this->set( 'plugins', Loco_package_Plugin::get_plugins() );
|
||||
// $this->set('installed', wp_get_installed_translations('plugins') );
|
||||
// $this->set('active', get_option( 'active_plugins', array() ) );
|
||||
// $this->set('langs',get_available_languages());
|
||||
|
||||
/*$plugins = get_plugins();
|
||||
$plugin_info = get_site_transient( 'update_plugins' );
|
||||
foreach( $plugins as $plugin_file => $plugin_data ){
|
||||
if ( isset( $plugin_info->response[$plugin_file] ) ) {
|
||||
$plugins[$plugin_file]['____'] = $plugin_info->response[$plugin_file];
|
||||
}
|
||||
}*/
|
||||
|
||||
/*/ inspect session and test flash messages
|
||||
$session = Loco_data_Session::get();
|
||||
$session->flash( 'success', microtime() );
|
||||
$this->set('session', $session->getArrayCopy() );
|
||||
Loco_data_Session::close();*/
|
||||
|
||||
// try some notices
|
||||
Loco_error_AdminNotices::add( new Loco_error_Success('This is a sample success message') );
|
||||
Loco_error_AdminNotices::add( new Loco_error_Warning('This is a sample warning') );
|
||||
Loco_error_AdminNotices::add( new Loco_error_Exception('This is a sample error') );
|
||||
Loco_error_AdminNotices::add( new Loco_error_Debug('This is a sample debug message') );
|
||||
//*/
|
||||
|
||||
return $this->view('admin/debug');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
42
vendor/loco-translate/src/admin/ErrorController.php
vendored
Normal file
42
vendor/loco-translate/src/admin/ErrorController.php
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Loco_admin_ErrorController extends Loco_mvc_AdminController {
|
||||
|
||||
|
||||
public function renderError( Exception $e ){
|
||||
$this->set('error', Loco_error_Exception::convert($e) );
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
|
||||
public function render(){
|
||||
$e = $this->get('error');
|
||||
if( $e ){
|
||||
/* @var Loco_error_Exception $e */
|
||||
$file = Loco_mvc_FileParams::create( new Loco_fs_File( $e->getRealFile() ) );
|
||||
$file['line'] = $e->getRealLine();
|
||||
$this->set('file', $file );
|
||||
if( loco_debugging() ){
|
||||
$trace = array();
|
||||
foreach( $e->getRealTrace() as $raw ) {
|
||||
$frame = new Loco_mvc_ViewParams($raw);
|
||||
if( $frame->has('file') ){
|
||||
$frame['file'] = Loco_mvc_FileParams::create( new Loco_fs_File($frame['file']) )->relpath;
|
||||
}
|
||||
$trace[] = $frame;
|
||||
}
|
||||
$this->set('trace',$trace);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$e = new Loco_error_Exception('Unknown error');
|
||||
$this->set('error', $e );
|
||||
}
|
||||
return $this->view( $e->getTemplate() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
72
vendor/loco-translate/src/admin/Navigation.php
vendored
Normal file
72
vendor/loco-translate/src/admin/Navigation.php
vendored
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
/**
|
||||
* Generic navigation helper.
|
||||
*/
|
||||
class Loco_admin_Navigation extends ArrayIterator {
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_admin_Navigation
|
||||
*/
|
||||
public function add( $name, $href = null, $active = false ){
|
||||
$this[] = new Loco_mvc_ViewParams( compact('name','href','active') );
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/* not currently used
|
||||
* @return Loco_admin_Navigation
|
||||
*
|
||||
public function addRoute( $name, $action ){
|
||||
$href = Loco_mvc_AdminRouter::generate( $action );
|
||||
return $this->add( $name, $href );
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create a breadcrumb trail for a given view below a bundle
|
||||
* @return Loco_admin_Navigation
|
||||
*/
|
||||
public static function createBreadcrumb( Loco_package_Bundle $bundle ){
|
||||
$nav = new Loco_admin_Navigation;
|
||||
|
||||
// root link depends on bundle type
|
||||
$type = strtolower( $bundle->getType() );
|
||||
if( 'core' !== $type ){
|
||||
$link = new Loco_mvc_ViewParams( array(
|
||||
'href' => Loco_mvc_AdminRouter::generate($type),
|
||||
) );
|
||||
if( 'theme' === $type ){
|
||||
$link['name'] = __('Themes','loco-translate');
|
||||
}
|
||||
else {
|
||||
$link['name'] = __('Plugins','loco-translate');
|
||||
}
|
||||
$nav[] = $link;
|
||||
}
|
||||
|
||||
// Add actual bundle page, href may be unset to show as current page if needed
|
||||
$nav->add (
|
||||
$bundle->getName(),
|
||||
Loco_mvc_AdminRouter::generate( $type.'-view', array( 'bundle' => $bundle->getHandle() ) )
|
||||
);
|
||||
|
||||
// client code will add current page
|
||||
return $nav;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_mvc_ViewParams
|
||||
*
|
||||
public function getSecondLast(){
|
||||
$i = count($this);
|
||||
if( $i > 1 ){
|
||||
return $this[ $i-2 ];
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
}
|
35
vendor/loco-translate/src/admin/RedirectController.php
vendored
Normal file
35
vendor/loco-translate/src/admin/RedirectController.php
vendored
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
/**
|
||||
*
|
||||
*/
|
||||
abstract class Loco_admin_RedirectController extends Loco_mvc_AdminController {
|
||||
|
||||
|
||||
/**
|
||||
* Get full URL for redirecting to.
|
||||
* @var string
|
||||
*/
|
||||
abstract public function getLocation();
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
$location = $this->getLocation();
|
||||
if( $location && wp_redirect($location) ){
|
||||
// @codeCoverageIgnoreStart
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public function render(){
|
||||
return 'Failed to redirect';
|
||||
}
|
||||
|
||||
}
|
90
vendor/loco-translate/src/admin/RootController.php
vendored
Normal file
90
vendor/loco-translate/src/admin/RootController.php
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
<?php
|
||||
/**
|
||||
* Highest level Loco admin screen.
|
||||
*/
|
||||
class Loco_admin_RootController extends Loco_admin_list_BaseController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-home'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render main entry home screen
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// translators: home screen title where %s is the version number
|
||||
$this->set('title', sprintf( __('Loco Translate %s','loco-translate'), loco_plugin_version() ) );
|
||||
|
||||
// Show currently active theme on home page
|
||||
$theme = Loco_package_Theme::create(null);
|
||||
$this->set('theme', $this->bundleParam($theme) );
|
||||
|
||||
// Show plugins that have currently loaded translations
|
||||
$bundles = array();
|
||||
foreach( Loco_package_Listener::singleton()->getPlugins() as $bundle ){
|
||||
try {
|
||||
$bundles[] = $this->bundleParam($bundle);
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// bundle should exist if we heard it. reduce to debug notice
|
||||
Loco_error_AdminNotices::debug( $e->getMessage() );
|
||||
}
|
||||
}
|
||||
$this->set('plugins', $bundles );
|
||||
|
||||
|
||||
// Show recently "used' bundles
|
||||
$bundles = array();
|
||||
$recent = Loco_data_RecentItems::get();
|
||||
// filter in lieu of plugin setting
|
||||
$maxlen = apply_filters('loco_num_recent_bundles', 10 );
|
||||
foreach( $recent->getBundles(0,$maxlen) as $id ){
|
||||
try {
|
||||
$bundle = Loco_package_Bundle::fromId($id);
|
||||
$bundles[] = $this->bundleParam($bundle);
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// possible that bundle ID changed since being saved in recent items list
|
||||
}
|
||||
}
|
||||
$this->set('recent', $bundles );
|
||||
|
||||
|
||||
// current locale and related links
|
||||
$locale = Loco_Locale::parse( get_locale() );
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
$tag = (string) $locale;
|
||||
$this->set( 'siteLocale', new Loco_mvc_ViewParams( array(
|
||||
'code' => $tag,
|
||||
'name' => ( $name = $locale->ensureName($api) ),
|
||||
'attr' => 'class="'.$locale->getIcon().'" lang="'.$locale->lang.'"',
|
||||
'link' => '<a href="'.esc_url(Loco_mvc_AdminRouter::generate('lang-view', array('locale'=>$tag) )).'">'.esc_html($name).'</a>',
|
||||
//'opts' => admin_url('options-general.php').'#WPLANG',
|
||||
) ) );
|
||||
|
||||
// user's "admin" language may differ and is worth showing
|
||||
if( function_exists('get_user_locale') ){
|
||||
$locale = Loco_Locale::parse( get_user_locale() );
|
||||
$alt = (string) $locale;
|
||||
if( $tag !== $alt ){
|
||||
$this->set( 'adminLocale', new Loco_mvc_ViewParams( array(
|
||||
'name' => ( $name = $locale->ensureName($api) ),
|
||||
'link' => '<a href="'.esc_url(Loco_mvc_AdminRouter::generate('lang-view', array('locale'=>$tag) )).'">'.esc_html($name).'</a>',
|
||||
) ) );
|
||||
}
|
||||
}
|
||||
|
||||
$this->set('title', __('Welcome to Loco Translate','loco-translate') );
|
||||
|
||||
return $this->view('admin/root');
|
||||
}
|
||||
|
||||
|
||||
}
|
161
vendor/loco-translate/src/admin/bundle/BaseController.php
vendored
Normal file
161
vendor/loco-translate/src/admin/bundle/BaseController.php
vendored
Normal file
|
@ -0,0 +1,161 @@
|
|||
<?php
|
||||
/**
|
||||
* Base controller for any admin screen related to a bundle
|
||||
*/
|
||||
abstract class Loco_admin_bundle_BaseController extends Loco_mvc_AdminController {
|
||||
|
||||
/**
|
||||
* @var Loco_package_Bundle
|
||||
*/
|
||||
private $bundle;
|
||||
|
||||
/**
|
||||
* @var Loco_package_Project
|
||||
*/
|
||||
private $project;
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_package_Bundle
|
||||
*/
|
||||
public function getBundle(){
|
||||
if( ! $this->bundle ){
|
||||
$type = $this->get('type');
|
||||
$handle = $this->get('bundle');
|
||||
$this->bundle = Loco_package_Bundle::createType( $type, $handle );
|
||||
}
|
||||
return $this->bundle;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Commit bundle config to database
|
||||
* @return Loco_admin_bundle_BaseController
|
||||
*/
|
||||
protected function saveBundle(){
|
||||
$custom = new Loco_config_CustomSaved;
|
||||
if( $custom->setBundle($this->bundle)->persist() ){
|
||||
Loco_error_AdminNotices::success( __('Configuration saved','loco-translate') );
|
||||
}
|
||||
// invalidate bundle in memory so next fetch is re-configured from DB
|
||||
$this->bundle = null;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove bundle config from database
|
||||
* @return Loco_admin_bundle_BaseController
|
||||
*/
|
||||
protected function resetBundle(){
|
||||
$option = $this->bundle->getCustomConfig();
|
||||
if( $option && $option->remove() ){
|
||||
Loco_error_AdminNotices::success( __('Configuration reset','loco-translate') );
|
||||
// invalidate bundle in memory so next fetch falls back to auto-config
|
||||
$this->bundle = null;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_package_Project
|
||||
*/
|
||||
public function getProject(){
|
||||
if( ! $this->project ){
|
||||
$bundle = $this->getBundle();
|
||||
$domain = $this->get('domain');
|
||||
if( ! $domain ){
|
||||
throw new Loco_error_Exception( sprintf('Translation set not known in %s', $bundle ) );
|
||||
}
|
||||
$this->project = $bundle->getProjectById($domain);
|
||||
if( ! $this->project ){
|
||||
throw new Loco_error_Exception( sprintf('Unknown translation set: %s not in %s', json_encode($domain), $bundle ) );
|
||||
}
|
||||
}
|
||||
|
||||
return $this->project;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_admin_Navigation
|
||||
*/
|
||||
protected function prepareNavigation(){
|
||||
$bundle = $this->getBundle();
|
||||
|
||||
// navigate up to bundle listing page
|
||||
$breadcrumb = Loco_admin_Navigation::createBreadcrumb( $bundle );
|
||||
$this->set( 'breadcrumb', $breadcrumb );
|
||||
|
||||
// navigate between bundle view siblings
|
||||
$tabs = new Loco_admin_Navigation;
|
||||
$this->set( 'tabs', $tabs );
|
||||
$actions = array (
|
||||
'view' => __('Overview','loco-translate'),
|
||||
'setup' => __('Setup','loco-translate'),
|
||||
'conf' => __('Advanced','loco-translate'),
|
||||
);
|
||||
if( loco_debugging() ){
|
||||
$actions['debug'] = __('Debug','loco-translate');
|
||||
}
|
||||
$suffix = $this->get('action');
|
||||
$prefix = strtolower( $this->get('type') );
|
||||
$getarg = array_intersect_key( $_GET, array('bundle'=>'') );
|
||||
foreach( $actions as $action => $name ){
|
||||
$href = Loco_mvc_AdminRouter::generate( $prefix.'-'.$action, $getarg );
|
||||
$tabs->add( $name, $href, $action === $suffix );
|
||||
}
|
||||
|
||||
return $breadcrumb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prepare file system connect
|
||||
* @param string "create", "update", "delete"
|
||||
* @param string path relative to wp-content
|
||||
* @return Loco_mvc_HiddenFields
|
||||
*/
|
||||
protected function prepareFsConnect( $type, $relpath ){
|
||||
|
||||
$fields = new Loco_mvc_HiddenFields( array(
|
||||
'auth' => $type,
|
||||
'path' => $relpath,
|
||||
'loco-nonce' => wp_create_nonce('fsConnect'),
|
||||
'_fs_nonce' => wp_create_nonce('filesystem-credentials'), // <- WP 4.7.5 added security fix
|
||||
) ) ;
|
||||
$this->set('fsFields', $fields );
|
||||
|
||||
// may have fs credentials saved in session
|
||||
try {
|
||||
if( Loco_data_Settings::get()->fs_persist ){
|
||||
$session = Loco_data_Session::get();
|
||||
if( isset($session['loco-fs']) ){
|
||||
$fields['connection_type'] = $session['loco-fs']['connection_type'];
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Exception $e ){
|
||||
Loco_error_AdminNotices::debug( $e->getMessage() );
|
||||
}
|
||||
|
||||
// Run pre-checks that may determine file should not be written
|
||||
if( $relpath ){
|
||||
$file = new Loco_fs_File( $relpath );
|
||||
$file->normalize( loco_constant('WP_CONTENT_DIR') );
|
||||
// total file system block makes connection type irrelevant
|
||||
try {
|
||||
$api = new Loco_api_WordPressFileSystem;
|
||||
$api->preAuthorize($file);
|
||||
}
|
||||
catch( Loco_error_WriteException $e ){
|
||||
$this->set('fsLocked', $e->getMessage() );
|
||||
}
|
||||
}
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
}
|
145
vendor/loco-translate/src/admin/bundle/ConfController.php
vendored
Normal file
145
vendor/loco-translate/src/admin/bundle/ConfController.php
vendored
Normal file
|
@ -0,0 +1,145 @@
|
|||
<?php
|
||||
/**
|
||||
* Bundle configuration page
|
||||
*/
|
||||
class Loco_admin_bundle_ConfController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('config');
|
||||
$this->enqueueScript('config');
|
||||
$bundle = $this->getBundle();
|
||||
// translators: where %s is a plugin or theme
|
||||
$this->set( 'title', sprintf( __('Configure %s','loco-translate'),$bundle->getName() ) );
|
||||
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
// always set a nonce for current bundle
|
||||
$nonce = $this->setNonce( $this->get('_route').'-'.$this->get('bundle') );
|
||||
$this->set('nonce', $nonce );
|
||||
try {
|
||||
// Save configuration if posted
|
||||
if( $post->has('conf') ){
|
||||
if( ! $post->name ){
|
||||
$post->name = $bundle->getName();
|
||||
}
|
||||
$this->checkNonce( $nonce->action );
|
||||
$model = new Loco_config_FormModel;
|
||||
$model->loadForm( $post );
|
||||
// configure bundle from model in full
|
||||
$bundle->clear();
|
||||
$reader = new Loco_config_BundleReader( $bundle );
|
||||
$reader->loadModel( $model );
|
||||
$this->saveBundle();
|
||||
}
|
||||
// Delete configuration if posted
|
||||
else if( $post->has('unconf') ){
|
||||
$this->resetBundle();
|
||||
}
|
||||
}
|
||||
catch( Exception $e ){
|
||||
Loco_error_AdminNotices::warn( $e->getMessage() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Advanced tab','loco-translate') => $this->viewSnippet('tab-bundle-conf'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render() {
|
||||
|
||||
$parent = null;
|
||||
$bundle = $this->getBundle();
|
||||
$default = $bundle->getDefaultProject();
|
||||
$base = $bundle->getDirectoryPath();
|
||||
|
||||
|
||||
// parent themes are inherited into bundle, we don't want them in the child theme config
|
||||
if( $bundle->isTheme() && ( $parent = $bundle->getParent() ) ){
|
||||
$this->set( 'parent', new Loco_mvc_ViewParams( array(
|
||||
'name' => $parent->getName(),
|
||||
'href' => Loco_mvc_AdminRouter::generate('theme-conf', array( 'bundle' => $parent->getSlug() ) + $_GET ),
|
||||
) ) );
|
||||
}
|
||||
|
||||
// render postdata straight back to form if sent
|
||||
$data = Loco_mvc_PostParams::get();
|
||||
// else build initial data from current bundle state
|
||||
if( ! $data->has('conf') ){
|
||||
// create single default set for totally unconfigured bundles
|
||||
if( 0 === count($bundle) ){
|
||||
$bundle->createDefault('');
|
||||
}
|
||||
$writer = new Loco_config_BundleWriter($bundle);
|
||||
$data = $writer->toForm();
|
||||
// removed parent bundle from config form, as they are inherited
|
||||
/* @var Loco_package_Project $project */
|
||||
foreach( $bundle as $i => $project ){
|
||||
if( $parent && $parent->hasProject($project) ){
|
||||
// warn if child theme uses parent theme's text domain (but allowing to render so we don't get an empty form.
|
||||
if( $project === $default ){
|
||||
Loco_error_AdminNotices::warn( __("Child theme declares the same Text Domain as the parent theme",'loco-translate') );
|
||||
}
|
||||
// else safe to remove parent theme configuration as it should be held in its own bundle
|
||||
else {
|
||||
$data['conf'][$i]['removed'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// build config blocks for form
|
||||
$i = 0;
|
||||
$conf = array();
|
||||
foreach( $data['conf'] as $raw ){
|
||||
if( empty($raw['removed']) ){
|
||||
$slug = $raw['slug'];
|
||||
$domain = $raw['domain'] or $domain = 'untitled';
|
||||
$raw['prefix'] = sprintf('conf[%u]', $i++ );
|
||||
$raw['short'] = ! $slug || ( $slug === $domain ) ? $domain : $domain.'→'.$slug;
|
||||
$conf[] = new Loco_mvc_ViewParams( $raw );
|
||||
}
|
||||
}
|
||||
|
||||
// bundle level configs
|
||||
$name = $bundle->getName();
|
||||
$excl = $data['exclude'];
|
||||
|
||||
|
||||
// access to type of configuration that's currently saved
|
||||
$this->set('saved', $bundle->isConfigured() );
|
||||
|
||||
// link to author if there are config problems
|
||||
$info = $bundle->getHeaderInfo();
|
||||
$this->set('author', $info->getAuthorLink() );
|
||||
|
||||
// link for downloading current configuration XML file
|
||||
$args = array (
|
||||
'path' => 'loco.xml',
|
||||
'action' => 'loco_download',
|
||||
'bundle' => $bundle->getHandle(),
|
||||
'type' => $bundle->getType()
|
||||
);
|
||||
$this->set( 'xmlUrl', Loco_mvc_AjaxRouter::generate( 'DownloadConf', $args ) );
|
||||
$this->set( 'manUrl', apply_filters('loco_external','https://localise.biz/wordpress/plugin/manual/bundle-config') );
|
||||
|
||||
$this->prepareNavigation()->add( __('Advanced configuration','loco-translate') );
|
||||
return $this->view('admin/bundle/conf', compact('conf','base','name','excl') );
|
||||
}
|
||||
|
||||
|
||||
}
|
52
vendor/loco-translate/src/admin/bundle/DebugController.php
vendored
Normal file
52
vendor/loco-translate/src/admin/bundle/DebugController.php
vendored
Normal file
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
/**
|
||||
* Bundle debugger.
|
||||
* Shows bundle diagnostics and highlights problems
|
||||
*/
|
||||
class Loco_admin_bundle_DebugController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', 'Debug: '.$bundle );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$this->prepareNavigation()->add( __('Bundle diagnostics','loco-translate') );
|
||||
|
||||
$bundle = $this->getBundle();
|
||||
$debugger = new Loco_package_Debugger($bundle);
|
||||
$this->set('notices', $notices = new Loco_mvc_ViewParams );
|
||||
/* @var $notice Loco_error_Exception */
|
||||
foreach( $debugger as $notice ){
|
||||
$notices[] = new Loco_mvc_ViewParams( array(
|
||||
'style' => 'notice inline notice-'.$notice->getType(),
|
||||
'title' => $notice->getTitle(),
|
||||
'body' => $notice->getMessage(),
|
||||
) );
|
||||
}
|
||||
|
||||
$meta = $bundle->getHeaderInfo();
|
||||
$this->set('meta', new Loco_mvc_ViewParams( array(
|
||||
'vendor' => $meta->getVendorHost(),
|
||||
'author' => $meta->getAuthorCredit(),
|
||||
) ) );
|
||||
|
||||
if( count($bundle) ){
|
||||
$writer = new Loco_config_BundleWriter( $bundle );
|
||||
$this->set( 'xml', $writer->toXml() );
|
||||
}
|
||||
|
||||
return $this->view('admin/bundle/debug');
|
||||
}
|
||||
|
||||
}
|
162
vendor/loco-translate/src/admin/bundle/LocaleController.php
vendored
Normal file
162
vendor/loco-translate/src/admin/bundle/LocaleController.php
vendored
Normal file
|
@ -0,0 +1,162 @@
|
|||
<?php
|
||||
/**
|
||||
* Pseudo-bundle view, lists all files available in a single locale
|
||||
*/
|
||||
class Loco_admin_bundle_LocaleController extends Loco_mvc_AdminController {
|
||||
|
||||
/**
|
||||
* @var Loco_Locale
|
||||
*/
|
||||
private $locale;
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$tag = $this->get('locale');
|
||||
$locale = Loco_Locale::parse($tag);
|
||||
if( $locale->isValid() ){
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
$this->set('title', $locale->ensureName($api) );
|
||||
$this->locale = $locale;
|
||||
$this->enqueueStyle('locale')->enqueueStyle('fileinfo');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-locale-view'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// locale already parsed during init (for page title)
|
||||
$locale = $this->locale;
|
||||
if( ! $locale || ! $locale->isValid() ){
|
||||
throw new Loco_error_Exception('Invalid locale argument');
|
||||
}
|
||||
|
||||
// language may not be "installed" but we still want to inspect available files
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
$installed = $api->isInstalled($locale);
|
||||
|
||||
$tag = (string) $locale;
|
||||
$package = new Loco_package_Locale( $locale );
|
||||
|
||||
// Get PO files for this locale
|
||||
$files = $package->findLocaleFiles();
|
||||
$translations = array();
|
||||
$modified = 0;
|
||||
$npofiles = 0;
|
||||
$nfiles = 0;
|
||||
|
||||
// source locale means we want to see POT instead of translations
|
||||
if( 'en_US' === $tag ){
|
||||
$files = $package->findTemplateFiles()->augment($files);
|
||||
}
|
||||
|
||||
/* @var Loco_fs_File */
|
||||
foreach( $files as $file ){
|
||||
$nfiles++;
|
||||
if( 'pot' !== $file->extension() ){
|
||||
$npofiles++;
|
||||
}
|
||||
$modified = max( $modified, $file->modified() );
|
||||
$project = $package->getProject($file);
|
||||
// do similarly to Loco_admin_bundle_ViewController::createFileParams
|
||||
$meta = Loco_gettext_Metadata::load($file);
|
||||
$dir = new Loco_fs_LocaleDirectory( $file->dirname() );
|
||||
// arguments for deep link into project
|
||||
$slug = $project->getSlug();
|
||||
$domain = $project->getDomain()->getName();
|
||||
$bundle = $project->getBundle();
|
||||
$type = strtolower( $bundle->getType() );
|
||||
$args = array(
|
||||
// 'locale' => $tag,
|
||||
'bundle' => $bundle->getHandle(),
|
||||
'domain' => $project->getId(),
|
||||
'path' => $meta->getPath(false),
|
||||
);
|
||||
// append data required for PO table row, except use bundle data instead of locale data
|
||||
$translations[$type][] = new Loco_mvc_ViewParams( array (
|
||||
// bundle info
|
||||
'title' => $project->getName(),
|
||||
'domain' => $domain,
|
||||
'short' => ! $slug || $project->isDomainDefault() ? $domain : $domain.'→'.$slug,
|
||||
// file info
|
||||
'meta' => $meta,
|
||||
'name' => $file->basename(),
|
||||
'time' => $file->modified(),
|
||||
'type' => strtoupper( $file->extension() ),
|
||||
'todo' => $meta->countIncomplete(),
|
||||
'total' => $meta->getTotal(),
|
||||
// author / system / custom / other
|
||||
'store' => $dir->getTypeLabel( $dir->getTypeId() ),
|
||||
// links
|
||||
'view' => Loco_mvc_AdminRouter::generate( $type.'-file-view', $args ),
|
||||
'info' => Loco_mvc_AdminRouter::generate( $type.'-file-info', $args ),
|
||||
'edit' => Loco_mvc_AdminRouter::generate( $type.'-file-edit', $args ),
|
||||
'move' => Loco_mvc_AdminRouter::generate( $type.'-file-move', $args ),
|
||||
'delete' => Loco_mvc_AdminRouter::generate( $type.'-file-delete', $args ),
|
||||
'copy' => Loco_mvc_AdminRouter::generate( $type.'-msginit', $args ),
|
||||
) );
|
||||
}
|
||||
|
||||
$title = __( 'Installed languages', 'loco-translate' );
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title, Loco_mvc_AdminRouter::generate('lang') );
|
||||
//$breadcrumb->add( $locale->getName() );
|
||||
$breadcrumb->add( $tag );
|
||||
|
||||
// It's unlikely that an "installed" language would have no files, but could happen if only MO on disk
|
||||
if( 0 === $nfiles ){
|
||||
return $this->view('admin/errors/no-locale', compact('breadcrumb','locale') );
|
||||
}
|
||||
|
||||
// files may be available for language even if not installed (i.e. no core files on disk)
|
||||
if( ! $installed || ! isset($translations['core']) && 'en_US' !== $tag ){
|
||||
Loco_error_AdminNotices::warn( __('No core translation files are installed for this language','loco-translate') )
|
||||
->addLink('https://codex.wordpress.org/Installing_WordPress_in_Your_Language', __('Documentation','loco-translate') );
|
||||
}
|
||||
|
||||
// Translated type labels and "See all <type>" links
|
||||
$types = array(
|
||||
'core' => new Loco_mvc_ViewParams( array(
|
||||
'name' => __('WordPress Core','loco-translate'),
|
||||
'text' => __('See all core translations','loco-translate'),
|
||||
'href' => Loco_mvc_AdminRouter::generate('core')
|
||||
) ),
|
||||
'theme' => new Loco_mvc_ViewParams( array(
|
||||
'name' => __('Themes','loco-translate'),
|
||||
'text' => __('See all themes','loco-translate'),
|
||||
'href' => Loco_mvc_AdminRouter::generate('theme')
|
||||
) ),
|
||||
'plugin' => new Loco_mvc_ViewParams( array(
|
||||
'name' => __('Plugins','loco-translate'),
|
||||
'text' => __('See all plugins','loco-translate'),
|
||||
'href' => Loco_mvc_AdminRouter::generate('plugin')
|
||||
) ),
|
||||
);
|
||||
|
||||
$this->set( 'locale', new Loco_mvc_ViewParams( array(
|
||||
'code' => $tag,
|
||||
'name' => $locale->getName(),
|
||||
'attr' => 'class="'.$locale->getIcon().'" lang="'.$locale->lang.'"',
|
||||
) ) );
|
||||
|
||||
return $this->view( 'admin/bundle/locale', compact('breadcrumb','translations','types','npofiles','modified') );
|
||||
}
|
||||
|
||||
|
||||
}
|
193
vendor/loco-translate/src/admin/bundle/SetupController.php
vendored
Normal file
193
vendor/loco-translate/src/admin/bundle/SetupController.php
vendored
Normal file
|
@ -0,0 +1,193 @@
|
|||
<?php
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Loco_admin_bundle_SetupController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$bundle = $this->getBundle();
|
||||
|
||||
// translators: where %s is a plugin or theme
|
||||
$this->set( 'title', sprintf( __('Set up %s','loco-translate'),$bundle->getName() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Setup tab','loco-translate') => $this->viewSnippet('tab-bundle-setup'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$this->prepareNavigation()->add( __('Bundle setup','loco-translate') );
|
||||
$bundle = $this->getBundle();
|
||||
$action = 'setup:'.$bundle->getId();
|
||||
|
||||
// execute auto-configure if posted
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
if( $post->has('auto-setup') && $this->checkNonce( 'auto-'.$action) ){
|
||||
if( 0 === count($bundle) ){
|
||||
$bundle->createDefault();
|
||||
}
|
||||
foreach( $bundle as $project ){
|
||||
if( ! $project->getPot() && ( $file = $project->guessPot() ) ){
|
||||
$project->setPot( $file );
|
||||
}
|
||||
}
|
||||
// forcefully add every additional project into bundle
|
||||
foreach( $bundle->invert() as $project ){
|
||||
if( ! $project->getPot() && ( $file = $project->guessPot() ) ){
|
||||
$project->setPot( $file );
|
||||
}
|
||||
$bundle[] = $project;
|
||||
}
|
||||
$this->saveBundle();
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('auto', null );
|
||||
}
|
||||
// execute XML-based config if posted
|
||||
else if( $post->has('xml-setup') && $this->checkNonce( 'xml-'.$action) ){
|
||||
$bundle->clear();
|
||||
$model = new Loco_config_XMLModel;
|
||||
$model->loadXml( trim( $post['xml-content'] ) );
|
||||
$reader = new Loco_config_BundleReader($bundle);
|
||||
$reader->loadModel( $model );
|
||||
$this->saveBundle();
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('xml', null );
|
||||
}
|
||||
// execute JSON-based config if posted
|
||||
else if( $post->has('json-setup') && $this->checkNonce( 'json-'.$action) ){
|
||||
$bundle->clear();
|
||||
$model = new Loco_config_ArrayModel;
|
||||
$model->loadJson( trim( $post['json-content'] ) );
|
||||
$reader = new Loco_config_BundleReader($bundle);
|
||||
$reader->loadModel( $model );
|
||||
$this->saveBundle();
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('json', null );
|
||||
}
|
||||
// execute reset if posted
|
||||
else if( $post->has('reset-setup') && $this->checkNonce( 'reset-'.$action) ){
|
||||
$this->resetBundle();
|
||||
$bundle = $this->getBundle();
|
||||
}
|
||||
|
||||
// bundle author links
|
||||
$info = $bundle->getHeaderInfo();
|
||||
$this->set( 'credit', $info->getAuthorCredit() );
|
||||
|
||||
// render according to current configuration method (save type)
|
||||
$configured = $this->get('force') or $configured = $bundle->isConfigured();
|
||||
|
||||
$notices = new ArrayIterator;
|
||||
$this->set('notices', $notices );
|
||||
|
||||
// collect configuration warnings
|
||||
foreach( $bundle as $project ){
|
||||
$potfile = $project->getPot();
|
||||
if( ! $potfile ){
|
||||
$notices[] = sprintf('No translation template for the "%s" text domain', $project->getSlug() );
|
||||
}
|
||||
}
|
||||
// if extra files found consider incomplete
|
||||
if( $bundle->isTheme() || ( $bundle->isPlugin() && ! $bundle->isSingleFile() ) ){
|
||||
$unknown = Loco_package_Inverter::export($bundle);
|
||||
$n = 0;
|
||||
foreach( $unknown as $ext => $files ){
|
||||
$n += count($files);
|
||||
}
|
||||
if( $n ){
|
||||
$notices[] = sprintf( _n("One file can't be matched to a known set of strings","%s files can't be matched to a known set of strings",$n,'loco-translate'), number_format($n) );
|
||||
}
|
||||
}
|
||||
|
||||
// display setup options if at least one option specified
|
||||
$doconf = false;
|
||||
|
||||
// enable form to invoke auto-configuration
|
||||
if( $this->get('auto') ){
|
||||
$fields = new Loco_mvc_HiddenFields();
|
||||
$fields->setNonce( 'auto-'.$action );
|
||||
$this->set('autoFields', $fields );
|
||||
$doconf = true;
|
||||
}
|
||||
|
||||
// enable form to paste XML config
|
||||
if( $this->get('xml') ){
|
||||
$fields = new Loco_mvc_HiddenFields();
|
||||
$fields->setNonce( 'xml-'.$action );
|
||||
$this->set('xmlFields', $fields );
|
||||
$doconf = true;
|
||||
}
|
||||
|
||||
// enable form to paste JSON config (via remote lookup)
|
||||
if( $this->get('json') ){
|
||||
$fields = new Loco_mvc_HiddenFields( array(
|
||||
'json-content' => '',
|
||||
'version' => $info->Version,
|
||||
) );
|
||||
$fields->setNonce( 'json-'.$action );
|
||||
$this->set('jsonFields', $fields );
|
||||
|
||||
// other information for looking up bundle via api
|
||||
$this->set('vendorSlug', $bundle->getSlug() );
|
||||
|
||||
// remote config is done via JavaScript
|
||||
$this->enqueueScript('setup');
|
||||
$apiBase = apply_filters( 'loco_api_url', 'https://localise.biz/api' );
|
||||
$this->set('js', new Loco_mvc_ViewParams( array(
|
||||
'apiUrl' => $apiBase.'/wp/'.strtolower( $bundle->getType() ),
|
||||
) ) );
|
||||
$doconf = true;
|
||||
}
|
||||
|
||||
// display configurator if configurating
|
||||
if( $doconf ){
|
||||
return $this->view( 'admin/bundle/setup/conf' );
|
||||
}
|
||||
// else set configurator links back to self with required option
|
||||
// ...
|
||||
|
||||
|
||||
if( ! $configured || ! count($bundle) ){
|
||||
return $this->view( 'admin/bundle/setup/none' );
|
||||
}
|
||||
|
||||
if( 'db' === $configured ){
|
||||
// form for resetting config
|
||||
$fields = new Loco_mvc_HiddenFields();
|
||||
$fields->setNonce( 'reset-'.$action );
|
||||
$this->set( 'reset', $fields );
|
||||
return $this->view('admin/bundle/setup/saved');
|
||||
}
|
||||
|
||||
if( 'internal' === $configured ){
|
||||
return $this->view('admin/bundle/setup/core');
|
||||
}
|
||||
|
||||
if( 'file' === $configured ){
|
||||
return $this->view('admin/bundle/setup/author');
|
||||
}
|
||||
|
||||
if( count($notices) ){
|
||||
return $this->view('admin/bundle/setup/partial');
|
||||
}
|
||||
|
||||
return $this->view('admin/bundle/setup/meta');
|
||||
}
|
||||
|
||||
}
|
324
vendor/loco-translate/src/admin/bundle/ViewController.php
vendored
Normal file
324
vendor/loco-translate/src/admin/bundle/ViewController.php
vendored
Normal file
|
@ -0,0 +1,324 @@
|
|||
<?php
|
||||
/**
|
||||
* Bundle overview.
|
||||
* First tier bundle view showing resources across all projects
|
||||
*/
|
||||
class Loco_admin_bundle_ViewController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', $bundle->getName() );
|
||||
$this->enqueueStyle('bundle');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-bundle-view'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate a link for a specific file resource within a project
|
||||
* @return string
|
||||
*/
|
||||
private function getResourceLink( $page, Loco_package_Project $project, Loco_gettext_Metadata $meta, array $args = array() ){
|
||||
$args['path'] = $meta->getPath(false);
|
||||
return $this->getProjectLink( $page, $project, $args );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate a link for a project, but without being for a specific file
|
||||
* @return string
|
||||
*/
|
||||
private function getProjectLink( $page, Loco_package_Project $project, array $args = array() ){
|
||||
$args['bundle'] = $this->get('bundle');
|
||||
$args['domain'] = $project->getId();
|
||||
$route = strtolower( $this->get('type') ).'-'.$page;
|
||||
return Loco_mvc_AdminRouter::generate( $route, $args );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize view parameters for a project
|
||||
* @param Loco_package_Project
|
||||
* @return Loco_mvc_ViewParams
|
||||
*/
|
||||
private function createProjectParams( Loco_package_Project $project ){
|
||||
$name = $project->getName();
|
||||
$domain = $project->getDomain()->getName();
|
||||
$slug = $project->getSlug();
|
||||
$p = new Loco_mvc_ViewParams( array (
|
||||
'id' => $project->getId(),
|
||||
'name' => $name,
|
||||
'slug' => $slug,
|
||||
'domain' => $domain,
|
||||
'short' => ! $slug || $project->isDomainDefault() ? $domain : $domain.'→'.$slug,
|
||||
) );
|
||||
|
||||
// POT template file
|
||||
$file = $project->getPot();
|
||||
if( $file && $file->exists() ){
|
||||
$meta = Loco_gettext_Metadata::load($file);
|
||||
$p['pot'] = new Loco_mvc_ViewParams( array(
|
||||
// POT info
|
||||
'name' => $file->basename(),
|
||||
'time' => $file->modified(),
|
||||
// POT links
|
||||
'info' => $this->getResourceLink('file-info', $project, $meta ),
|
||||
'edit' => $this->getResourceLink('file-edit', $project, $meta ),
|
||||
) );
|
||||
}
|
||||
|
||||
// PO/MO files
|
||||
$po = $project->findLocaleFiles('po');
|
||||
$mo = $project->findLocaleFiles('mo');
|
||||
$p['po'] = $this->createProjectPairs( $project, $po, $mo );
|
||||
|
||||
// also pull invalid files so everything is available to the UI
|
||||
$mo = $project->findNotLocaleFiles('mo');
|
||||
$po = $project->findNotLocaleFiles('po')->augment( $project->findNotLocaleFiles('pot') );
|
||||
$p['_po'] = $this->createProjectPairs( $project, $po, $mo );
|
||||
|
||||
// always offer msginit even if we find out later we can't extract any strings
|
||||
$p['nav'][] = new Loco_mvc_ViewParams( array(
|
||||
'href' => $this->getProjectLink('msginit', $project ),
|
||||
'name' => __('New language','loco-translate'),
|
||||
'icon' => 'add',
|
||||
) );
|
||||
|
||||
$pot = $project->getPot();
|
||||
|
||||
// prevent editing of POT when config prohibits
|
||||
if( $project->isPotLocked() || 1 < Loco_data_Settings::get()->pot_protect ) {
|
||||
if( $pot && $pot->exists() ){
|
||||
$meta = Loco_gettext_Metadata::load($pot);
|
||||
$p['nav'][] = new Loco_mvc_ViewParams( array(
|
||||
'href' => $this->getResourceLink('file-view', $project, $meta ),
|
||||
'name' => __('View template','loco-translate'),
|
||||
'icon' => 'file',
|
||||
) );
|
||||
}
|
||||
}
|
||||
// offer template editing if permitted
|
||||
else if( $pot && $pot->exists() ){
|
||||
$p['pot'] = $pot;
|
||||
$meta = Loco_gettext_Metadata::load($pot);
|
||||
$p['nav'][] = new Loco_mvc_ViewParams( array(
|
||||
'href' => $this->getResourceLink('file-edit', $project, $meta ),
|
||||
'name' => __('Edit template','loco-translate'),
|
||||
'icon' => 'pencil',
|
||||
) );
|
||||
}
|
||||
// else offer creation of new Template
|
||||
else {
|
||||
$p['nav'][] = new Loco_mvc_ViewParams( array(
|
||||
'href' => $this->getProjectLink('xgettext', $project ),
|
||||
'name' => __('Create template','loco-translate'),
|
||||
'icon' => 'add',
|
||||
) );
|
||||
}
|
||||
|
||||
return $p;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Collect PO/MO pairings, ignoring any PO that is in use as a template
|
||||
*/
|
||||
private function createPairs( Loco_fs_FileList $po, Loco_fs_FileList $mo, Loco_fs_File $pot = null ){
|
||||
$pairs = array();
|
||||
/* @var $pofile Loco_fs_LocaleFile */
|
||||
foreach( $po as $pofile ){
|
||||
if( $pot && $pofile->equal($pot) ){
|
||||
continue;
|
||||
}
|
||||
$pair = array( $pofile, null );
|
||||
$mofile = $pofile->cloneExtension('mo');
|
||||
if( $mofile->exists() ){
|
||||
$pair[1] = $mofile;
|
||||
}
|
||||
$pairs[] = $pair;
|
||||
}
|
||||
/* @var $mofile Loco_fs_LocaleFile */
|
||||
foreach( $mo as $mofile ){
|
||||
$pofile = $mofile->cloneExtension('po');
|
||||
if( $pot && $pofile->equal($pot) ){
|
||||
continue;
|
||||
}
|
||||
if( ! $pofile->exists() ){
|
||||
$pairs[] = array( null, $mofile );
|
||||
}
|
||||
}
|
||||
return $pairs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize view parameters for each row representing a localized resource pair
|
||||
* @return array collection of entries corresponding to available PO/MO pair.
|
||||
*/
|
||||
private function createProjectPairs( Loco_package_Project $project, Loco_fs_LocaleFileList $po, Loco_fs_LocaleFileList $mo ){
|
||||
// populate official locale names for all found, or default to our own
|
||||
if( $locales = $po->getLocales() + $mo->getLocales() ){
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
/* @var $locale Loco_Locale */
|
||||
foreach( $locales as $tag => $locale ){
|
||||
$locale->ensureName($api);
|
||||
}
|
||||
}
|
||||
// collate as unique [PO,MO] pairs ensuring canonical template excluded
|
||||
$pairs = $this->createPairs( $po, $mo, $project->getPot() );
|
||||
$rows = array();
|
||||
foreach( $pairs as $pair ){
|
||||
// favour PO file if it exists
|
||||
list( $pofile, $mofile ) = $pair;
|
||||
$file = $pofile or $file = $mofile;
|
||||
// establish locale, or assume invalid
|
||||
$locale = null;
|
||||
/* @var Loco_fs_LocaleFile $file */
|
||||
if( 'pot' !== $file->extension() ){
|
||||
$tag = $file->getSuffix();
|
||||
if( isset($locales[$tag]) ){
|
||||
$locale = $locales[$tag];
|
||||
}
|
||||
}
|
||||
$rows[] = $this->createFileParams( $project, $file, $locale );
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Loco_package_Project
|
||||
* @param Loco_fs_File
|
||||
* @param Loco_Locale
|
||||
* @return Loco_mvc_ViewParams
|
||||
*/
|
||||
private function createFileParams( Loco_package_Project $project, Loco_fs_File $file, Loco_Locale $locale = null ){
|
||||
// Pull Gettext meta data from cache if possible
|
||||
$meta = Loco_gettext_Metadata::load($file);
|
||||
$dir = new Loco_fs_LocaleDirectory( $file->dirname() );
|
||||
// routing arguments
|
||||
$args = array (
|
||||
'path' => $meta->getPath(false),
|
||||
);
|
||||
// Return data required for PO table row
|
||||
return new Loco_mvc_ViewParams( array (
|
||||
// locale info
|
||||
'lcode' => $locale ? (string) $locale : '',
|
||||
'lname' => $locale ? $locale->getName() : '',
|
||||
'lattr' => $locale ? 'class="'.$locale->getIcon().'" lang="'.$locale->lang.'"' : '',
|
||||
// file info
|
||||
'meta' => $meta,
|
||||
'name' => $file->basename(),
|
||||
'time' => $file->modified(),
|
||||
'type' => strtoupper( $file->extension() ),
|
||||
'todo' => $meta->countIncomplete(),
|
||||
'total' => $meta->getTotal(),
|
||||
// author / system / custom / other
|
||||
'store' => $dir->getTypeLabel( $dir->getTypeId() ),
|
||||
// links
|
||||
'view' => $this->getProjectLink('file-view', $project, $args ),
|
||||
'info' => $this->getProjectLink('file-info', $project, $args ),
|
||||
'edit' => $this->getProjectLink('file-edit', $project, $args ),
|
||||
'move' => $this->getProjectLink('file-move', $project, $args ),
|
||||
'delete' => $this->getProjectLink('file-delete', $project, $args ),
|
||||
'copy' => $this->getProjectLink('msginit', $project, $args ),
|
||||
) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare view parameters for all projects in a bundle
|
||||
* @param Loco_package_Bundle
|
||||
* @return array<Loco_mvc_ViewParams>
|
||||
*/
|
||||
private function createBundleListing( Loco_package_Bundle $bundle ){
|
||||
$projects = array();
|
||||
/* @var $project Loco_package_Project */
|
||||
foreach( $bundle as $project ){
|
||||
$projects[] = $this->createProjectParams($project);
|
||||
}
|
||||
return $projects;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$this->prepareNavigation();
|
||||
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('name', $bundle->getName() );
|
||||
|
||||
// bundle may not be fully configured
|
||||
$configured = $bundle->isConfigured();
|
||||
|
||||
// Hello Dolly is an exception. don't show unless configured deliberately
|
||||
if( 'Hello Dolly' === $bundle->getName() && 'hello.php' === basename($bundle->getHandle()) ){
|
||||
if( ! $configured || 'meta' === $configured ){
|
||||
$this->set( 'redirect', Loco_mvc_AdminRouter::generate('core-view') );
|
||||
return $this->view('admin/bundle/alias');
|
||||
}
|
||||
}
|
||||
|
||||
// Collect all configured projects
|
||||
$projects = $this->createBundleListing( $bundle );
|
||||
$unknown = array();
|
||||
|
||||
// sniff additional unknown files if bundle is a theme or directory-based plugin that's been auto-detected
|
||||
if( 'file' === $configured || 'internal' === $configured ){
|
||||
// presumed complete
|
||||
}
|
||||
else if( $bundle->isTheme() || ( $bundle->isPlugin() && ! $bundle->isSingleFile() ) ){
|
||||
// TODO This needs abstracting into the Loco_package_Inverter class
|
||||
$prefixes = array();
|
||||
$po = new Loco_fs_LocaleFileList;
|
||||
$mo = new Loco_fs_LocaleFileList;
|
||||
foreach( Loco_package_Inverter::export($bundle) as $ext => $files ){
|
||||
$list = 'mo' === $ext ? $mo : $po;
|
||||
foreach( $files as $file ){
|
||||
$file = new Loco_fs_LocaleFile($file);
|
||||
$list->addLocalized( $file );
|
||||
// Only look in system locations if locale is valid and domain/prefix available
|
||||
$locale = $file->getLocale();
|
||||
if( $locale->isValid() && ( $domain = $file->getPrefix() ) ){
|
||||
$prefixes[$domain] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// pick up given files in system locations only
|
||||
foreach( $prefixes as $domain => $_bool ){
|
||||
$dummy = new Loco_package_Project( $bundle, new Loco_package_TextDomain($domain), '' );
|
||||
$bundle->addProject( $dummy ); // <- required to configure locations
|
||||
$dummy->excludeTargetPath( $bundle->getDirectoryPath() );
|
||||
$po->augment( $dummy->findLocaleFiles('po') );
|
||||
$mo->augment( $dummy->findLocaleFiles('mo') );
|
||||
}
|
||||
// a fake project is required to disable functions that require a configured project
|
||||
$dummy = new Loco_package_Project( $bundle, new Loco_package_TextDomain(''), '' );
|
||||
$unknown = $this->createProjectPairs( $dummy, $po, $mo );
|
||||
}
|
||||
|
||||
$this->set('projects', $projects );
|
||||
$this->set('unknown', $unknown );
|
||||
|
||||
return $this->view( 'admin/bundle/view' );
|
||||
}
|
||||
|
||||
|
||||
}
|
66
vendor/loco-translate/src/admin/config/ApisController.php
vendored
Normal file
66
vendor/loco-translate/src/admin/config/ApisController.php
vendored
Normal file
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
/**
|
||||
* API keys/settings screen
|
||||
*/
|
||||
class Loco_admin_config_ApisController extends Loco_admin_config_BaseController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->set( 'title', __('API keys','loco-translate') );
|
||||
|
||||
// collect support API keys
|
||||
$apis = array();
|
||||
foreach( Loco_api_Providers::builtin() as $api ){
|
||||
$apis[ $api['id'] ] = new Loco_mvc_ViewParams($api);
|
||||
}
|
||||
$this->set('apis',$apis);
|
||||
|
||||
// handle save action
|
||||
$nonce = $this->setNonce('save-apis');
|
||||
try {
|
||||
if( $this->checkNonce($nonce->action) ){
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
if( $post->has('api') ){
|
||||
// Save only options in post. Avoids overwrite of missing site options
|
||||
$data = array();
|
||||
$filter = array();
|
||||
foreach( $apis as $id => $api ){
|
||||
$fields = $post->api[$id];
|
||||
if( is_array($fields) ){
|
||||
foreach( $fields as $prop => $value ){
|
||||
$apis[$id][$prop] = $value;
|
||||
$prop = $id.'_api_'.$prop;
|
||||
$data[$prop] = $value;
|
||||
$filter[] = $prop;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( $filter ){
|
||||
Loco_data_Settings::get()->populate($data,$filter)->persistIfDirty();
|
||||
Loco_error_AdminNotices::success( __('Settings saved','loco-translate') );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add($e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$title = __('Plugin settings','loco-translate');
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title );
|
||||
|
||||
return $this->view('admin/config/apis', compact('breadcrumb') );
|
||||
}
|
||||
|
||||
}
|
47
vendor/loco-translate/src/admin/config/BaseController.php
vendored
Normal file
47
vendor/loco-translate/src/admin/config/BaseController.php
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/**
|
||||
* Base controller for global plugin configuration screens
|
||||
*/
|
||||
abstract class Loco_admin_config_BaseController extends Loco_mvc_AdminController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
// navigate between config view siblings, but only if privileged user
|
||||
if( current_user_can('manage_options') ){
|
||||
$tabs = new Loco_admin_Navigation;
|
||||
$this->set( 'tabs', $tabs );
|
||||
$actions = array (
|
||||
'' => __('Site options','loco-translate'),
|
||||
'user' => __('User options','loco-translate'),
|
||||
'apis' => __('API keys','loco-translate'),
|
||||
'version' => __('Version','loco-translate'),
|
||||
);
|
||||
if( loco_debugging() ){
|
||||
$actions['debug'] = __('Debug','loco-translate');
|
||||
}
|
||||
$suffix = (string) $this->get('action');
|
||||
foreach( $actions as $action => $name ){
|
||||
$href = Loco_mvc_AdminRouter::generate( 'config-'.$action, $_GET );
|
||||
$tabs->add( $name, $href, $action === $suffix );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-config'),
|
||||
__('API keys','loco-translate') => $this->viewSnippet('tab-config-apis'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
168
vendor/loco-translate/src/admin/config/DebugController.php
vendored
Normal file
168
vendor/loco-translate/src/admin/config/DebugController.php
vendored
Normal file
|
@ -0,0 +1,168 @@
|
|||
<?php
|
||||
/**
|
||||
* Plugin config check (system diagnostics)
|
||||
*/
|
||||
class Loco_admin_config_DebugController extends Loco_admin_config_BaseController {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->set( 'title', __('Debug','loco-translate') );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return int
|
||||
*/
|
||||
private function memory_size( $raw ){
|
||||
$bytes = wp_convert_hr_to_bytes($raw);
|
||||
return Loco_mvc_FileParams::renderBytes($bytes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
private function rel_path( $path ){
|
||||
if( is_string($path) && $path && '/' === $path[0] ){
|
||||
$file = new Loco_fs_File( $path );
|
||||
$path = $file->getRelativePath(ABSPATH);
|
||||
}
|
||||
else if( ! $path ){
|
||||
$path = '(none)';
|
||||
}
|
||||
return $path;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$title = __('System diagnostics','loco-translate');
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title );
|
||||
|
||||
// extensions that are normally enabled in PHP by default
|
||||
loco_check_extension('json');
|
||||
loco_check_extension('ctype');
|
||||
|
||||
// product versions:
|
||||
$versions = new Loco_mvc_ViewParams( array (
|
||||
'Loco Translate' => loco_plugin_version(),
|
||||
'WordPress' => $GLOBALS['wp_version'],
|
||||
'PHP' => phpversion().' ('.PHP_SAPI.')',
|
||||
'Server' => isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ( function_exists('apache_get_version') ? apache_get_version() : '' ),
|
||||
) );
|
||||
// we want to know about modules in case there are security mods installed known to break functionality
|
||||
if( function_exists('apache_get_modules') && ( $mods = preg_grep('/^mod_/',apache_get_modules() ) ) ){
|
||||
$versions['Server'] .= ' + '.implode(', ',$mods);
|
||||
}
|
||||
|
||||
// byte code cache (currently only checking for Zend OPcache)
|
||||
if( function_exists('opcache_get_configuration') && ini_get('opcache.enable') ){
|
||||
$info = opcache_get_configuration();
|
||||
$vers = $info['version'];
|
||||
$versions[ $vers['opcache_product_name'] ] = ' '.$vers['version'];
|
||||
}
|
||||
|
||||
// utf8 / encoding:
|
||||
$encoding = new Loco_mvc_ViewParams( array (
|
||||
'OK' => "\xCE\x9F\xCE\x9A",
|
||||
'tick' => "\xE2\x9C\x93",
|
||||
'json' => json_decode('"\\u039f\\u039a \\u2713"'),
|
||||
'mbstring' => loco_check_extension('mbstring') ? "\xCE\x9F\xCE\x9A \xE2\x9C\x93" : 'No',
|
||||
) );
|
||||
|
||||
// Sanity check mbstring.func_overload
|
||||
if( 2 !== strlen("\xC2\xA3") ){
|
||||
$encoding->mbstring = 'Error, disable mbstring.func_overload';
|
||||
}
|
||||
|
||||
// PHP / env memory settings:
|
||||
$memory = new Loco_mvc_PostParams( array(
|
||||
'WP_MEMORY_LIMIT' => $this->memory_size( loco_constant('WP_MEMORY_LIMIT') ),
|
||||
'WP_MAX_MEMORY_LIMIT' => $this->memory_size( loco_constant('WP_MAX_MEMORY_LIMIT') ),
|
||||
'PHP memory_limit' => $this->memory_size( ini_get('memory_limit') ),
|
||||
'PHP post_max_size' => $this->memory_size( ini_get('post_max_size') ),
|
||||
//'PHP upload_max_filesize' => $this->memory_size( ini_get('upload_max_filesize') ),
|
||||
'PHP max_execution_time' => (string) ini_get('max_execution_time'),
|
||||
) );
|
||||
|
||||
// Check if raising memory limit works (wp>=4.6)
|
||||
if( function_exists('wp_is_ini_value_changeable') && wp_is_ini_value_changeable('memory_limit') ){
|
||||
$memory['PHP memory_limit'] .= ' (changeable)';
|
||||
}
|
||||
|
||||
// Ajaxing:
|
||||
$this->enqueueScript('debug');
|
||||
$this->set( 'js', new Loco_mvc_ViewParams( array (
|
||||
'nonces' => array( 'ping' => wp_create_nonce('ping'), 'apis' => wp_create_nonce('apis') ),
|
||||
) ) );
|
||||
|
||||
// Third party API integrations:
|
||||
$apis = array();
|
||||
$jsapis = array();
|
||||
foreach( Loco_api_Providers::export() as $api ){
|
||||
$apis[] = new Loco_mvc_ViewParams($api);
|
||||
$jsapis[] = $api;
|
||||
}
|
||||
if( $apis ){
|
||||
$this->set('apis',$apis);
|
||||
$jsconf = $this->get('js');
|
||||
$jsconf['apis'] = $jsapis;
|
||||
}
|
||||
|
||||
// File system access
|
||||
$dir = new Loco_fs_Directory( loco_constant('LOCO_LANG_DIR') ) ;
|
||||
$ctx = new Loco_fs_FileWriter( $dir );
|
||||
$fsp = Loco_data_Settings::get()->fs_protect;
|
||||
$fs = new Loco_mvc_PostParams( array(
|
||||
'langdir' => $this->rel_path( $dir->getPath() ),
|
||||
'writable' => $ctx->writable(),
|
||||
'disabled' => $ctx->disabled(),
|
||||
'fs_protect' => 1 === $fsp ? 'Warn' : ( $fsp ? 'Block' : 'Off' ),
|
||||
) );
|
||||
|
||||
// Debug and error log settings
|
||||
$debug = new Loco_mvc_ViewParams( array(
|
||||
'WP_DEBUG' => loco_constant('WP_DEBUG') ? 'On' : 'Off',
|
||||
'WP_DEBUG_LOG' => loco_constant('WP_DEBUG_LOG') ? 'On' : 'Off',
|
||||
'WP_DEBUG_DISPLAY' => loco_constant('WP_DEBUG_DISPLAY') ? 'On' : 'Off',
|
||||
'PHP display_errors' => ini_get('display_errors') ? 'On' : 'Off',
|
||||
'PHP log_errors' => ini_get('log_errors') ? 'On' : 'Off',
|
||||
'PHP error_log' => $this->rel_path( ini_get('error_log') ),
|
||||
) );
|
||||
|
||||
/* Output buffering settings
|
||||
$this->set('ob', new Loco_mvc_ViewParams( array(
|
||||
'output_handler' => ini_get('output_handler'),
|
||||
'zlib.output_compression' => ini_get('zlib.output_compression'),
|
||||
'zlib.output_compression_level' => ini_get('zlib.output_compression_level'),
|
||||
'zlib.output_handler' => ini_get('zlib.output_handler'),
|
||||
) ) );*/
|
||||
|
||||
// alert to known system setting problems:
|
||||
if( version_compare(PHP_VERSION,'7.4','<') ){
|
||||
if( get_magic_quotes_gpc() ){
|
||||
Loco_error_AdminNotices::add( new Loco_error_Debug('You have "magic_quotes_gpc" enabled. We recommend you disable this in PHP') );
|
||||
}
|
||||
if( get_magic_quotes_runtime() ){
|
||||
Loco_error_AdminNotices::add( new Loco_error_Debug('You have "magic_quotes_runtime" enabled. We recommend you disable this in PHP') );
|
||||
}
|
||||
}
|
||||
|
||||
// alert to third party plugins known to interfere with functioning of this plugin
|
||||
if( class_exists('\\LocoAutoTranslateAddon\\LocoAutoTranslate',false) ){
|
||||
Loco_error_AdminNotices::add( new Loco_error_Warning('Unoffical add-ons for Loco Translate may affect functionality. We cannot provide support when third party products are installed.') );
|
||||
}
|
||||
|
||||
return $this->view('admin/config/debug', compact('breadcrumb','versions','encoding','memory','fs','debug') );
|
||||
}
|
||||
|
||||
}
|
49
vendor/loco-translate/src/admin/config/PrefsController.php
vendored
Normal file
49
vendor/loco-translate/src/admin/config/PrefsController.php
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
/**
|
||||
* User-level plugin preferences
|
||||
*/
|
||||
class Loco_admin_config_PrefsController extends Loco_admin_config_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->set( 'title', __('User options','loco-translate') );
|
||||
|
||||
// user preference options
|
||||
$opts = Loco_data_Preferences::get();
|
||||
$this->set( 'opts', $opts );
|
||||
|
||||
// handle save action
|
||||
$nonce = $this->setNonce('save-prefs');
|
||||
try {
|
||||
if( $this->checkNonce($nonce->action) ){
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
if( $post->has('opts') ){
|
||||
$opts->populate( $post->opts )->persist();
|
||||
Loco_error_AdminNotices::success( __('Settings saved','loco-translate') );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add($e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$title = __('Plugin settings','loco-translate');
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title );
|
||||
|
||||
return $this->view('admin/config/prefs', compact('breadcrumb') );
|
||||
}
|
||||
|
||||
}
|
86
vendor/loco-translate/src/admin/config/SettingsController.php
vendored
Normal file
86
vendor/loco-translate/src/admin/config/SettingsController.php
vendored
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
/**
|
||||
* Site-wide Loco options (plugin settings)
|
||||
*/
|
||||
class Loco_admin_config_SettingsController extends Loco_admin_config_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
|
||||
// set current plugin options and defaults for placeholders
|
||||
$opts = Loco_data_Settings::get();
|
||||
$this->set( 'opts', $opts );
|
||||
$this->set( 'dflt', Loco_data_Settings::create() );
|
||||
|
||||
// roles and capabilities
|
||||
$perms = new Loco_data_Permissions;
|
||||
|
||||
// handle save action
|
||||
$nonce = $this->setNonce('save-config');
|
||||
try {
|
||||
if( $this->checkNonce($nonce->action) ){
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
if( $post->has('opts') ){
|
||||
$opts->populate( $post->opts )->persist();
|
||||
$perms->populate( $post->has('caps') ? $post->caps : array() );
|
||||
// done update
|
||||
Loco_error_AdminNotices::success( __('Settings saved','loco-translate') );
|
||||
// remove saved params from session if persistent options unset
|
||||
if( ! $opts['fs_persist'] ){
|
||||
$session = Loco_data_Session::get();
|
||||
if( isset($session['loco-fs']) ){
|
||||
unset( $session['loco-fs'] );
|
||||
$session->persist();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add($e);
|
||||
}
|
||||
|
||||
$this->set('caps', $caps = new Loco_mvc_ViewParams );
|
||||
// there is no distinct role for network admin, so we'll fake it for UI
|
||||
if( is_multisite() ){
|
||||
$caps[''] = new Loco_mvc_ViewParams( array(
|
||||
'label' => __('Super Admin','default'),
|
||||
'name' => 'dummy-admin-cap',
|
||||
'attrs' => 'checked disabled'
|
||||
) );
|
||||
}
|
||||
foreach( $perms->getRoles() as $id => $role ){
|
||||
$caps[$id] = new Loco_mvc_ViewParams( array(
|
||||
'value' => '1',
|
||||
'label' => $perms->getRoleName($id),
|
||||
'name' => 'caps['.$id.'][loco_admin]',
|
||||
'attrs' => $perms->isProtectedRole($role) ? 'checked disabled ' : ( $role->has_cap('loco_admin') ? 'checked ' : '' ),
|
||||
) );
|
||||
}
|
||||
// allow/deny warning levels
|
||||
$this->set('verbose', new Loco_mvc_ViewParams( array(
|
||||
0 => __('Allow','loco-translate'),
|
||||
1 => __('Allow (with warning)','loco-translate'),
|
||||
2 => __('Disallow','loco-translate'),
|
||||
) ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$title = __('Plugin settings','loco-translate');
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title );
|
||||
|
||||
return $this->view('admin/config/settings', compact('breadcrumb') );
|
||||
}
|
||||
|
||||
}
|
65
vendor/loco-translate/src/admin/config/VersionController.php
vendored
Normal file
65
vendor/loco-translate/src/admin/config/VersionController.php
vendored
Normal file
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
/**
|
||||
* Plugin version / upgrade screen
|
||||
*/
|
||||
class Loco_admin_config_VersionController extends Loco_admin_config_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->set( 'title', __('Version','loco-translate') );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$title = __('Plugin settings','loco-translate');
|
||||
$breadcrumb = new Loco_admin_Navigation;
|
||||
$breadcrumb->add( $title );
|
||||
|
||||
// current plugin version
|
||||
$version = loco_plugin_version();
|
||||
|
||||
// check for auto-update availability
|
||||
if( $updates = get_site_transient('update_plugins') ){
|
||||
$key = loco_plugin_self();
|
||||
if( isset($updates->response[$key]) ){
|
||||
$latest = $updates->response[$key]->new_version;
|
||||
// if current version is lower than latest, prompt update
|
||||
if( version_compare($version,$latest,'<') ){
|
||||
$this->setUpdate($latest);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// notify if running a development snapshot, but only if ahead of latest stable
|
||||
if( '-dev' === substr($version,-4) ){
|
||||
$this->set( 'devel', true );
|
||||
}
|
||||
|
||||
// $this->setUpdate('2.0.1-debug');
|
||||
return $this->view('admin/config/version', compact('breadcrumb','version') );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @param string version
|
||||
* @return void
|
||||
*/
|
||||
private function setUpdate( $version ){
|
||||
$action = 'upgrade-plugin_'.loco_plugin_self();
|
||||
$link = admin_url( 'update.php?action=upgrade-plugin&plugin='.rawurlencode(loco_plugin_self()) );
|
||||
|
||||
$this->set('update', $version );
|
||||
$this->set('update_href', wp_nonce_url( $link, $action ) );
|
||||
}
|
||||
|
||||
|
||||
}
|
167
vendor/loco-translate/src/admin/file/BaseController.php
vendored
Normal file
167
vendor/loco-translate/src/admin/file/BaseController.php
vendored
Normal file
|
@ -0,0 +1,167 @@
|
|||
<?php
|
||||
/**
|
||||
* Base class for a file resource belonging to a bundle
|
||||
* Root > List > Bundle > Resource
|
||||
*/
|
||||
abstract class Loco_admin_file_BaseController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
/**
|
||||
* @var Loco_Locale
|
||||
*/
|
||||
private $locale;
|
||||
|
||||
|
||||
/**
|
||||
* @return Loco_Locale
|
||||
*/
|
||||
protected function getLocale(){
|
||||
return $this->locale;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check file is valid or return error
|
||||
* @param Loco_fs_File
|
||||
* @return string rendered error
|
||||
*/
|
||||
protected function getFileError( Loco_fs_File $file = null ){
|
||||
// file must exist for editing
|
||||
if( is_null($file) || ! $file->exists() ){
|
||||
return $this->view( 'admin/errors/file-missing', array() );
|
||||
}
|
||||
if( $file->isDirectory() ){
|
||||
$this->set('info', Loco_mvc_FileParams::create($file) );
|
||||
return $this->view( 'admin/errors/file-isdir', array() );
|
||||
}
|
||||
// security validations
|
||||
try {
|
||||
Loco_gettext_Data::ext( $file );
|
||||
// TODO also need to block access to files outside content directory
|
||||
// this is more difficult as can symlink into and out of the tree.
|
||||
}
|
||||
catch( Exception $e ){
|
||||
return $this->view( 'admin/errors/file-sec', array( 'reason' => $e->getMessage() ) );
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
|
||||
// views at this level are always related to a file
|
||||
// file is permitted to be missing during this execution.
|
||||
$path = $this->get('path');
|
||||
if( ! $path ){
|
||||
throw new Loco_error_Exception('path argument required');
|
||||
}
|
||||
$file = new Loco_fs_LocaleFile( $path );
|
||||
$file->normalize( loco_constant('WP_CONTENT_DIR') );
|
||||
$ext = strtolower( $file->extension() );
|
||||
// POT file has no locale
|
||||
if( 'pot' === $ext ){
|
||||
$locale = null;
|
||||
$localised = false;
|
||||
}
|
||||
// else file may have a locale suffix (unless invalid, such as "default.po")
|
||||
else {
|
||||
$locale = $file->getLocale();
|
||||
$localised = $locale->isValid();
|
||||
}
|
||||
|
||||
if( $localised ){
|
||||
$this->locale = $locale;
|
||||
$code = (string) $locale;
|
||||
$this->set( 'locale', new Loco_mvc_ViewParams( array(
|
||||
'code' => $code,
|
||||
'lang' => $locale->lang,
|
||||
'icon' => $locale->getIcon(),
|
||||
'name' => $locale->ensureName( new Loco_api_WordPressTranslations ),
|
||||
'href' => Loco_mvc_AdminRouter::generate('lang-view', array('locale'=>$code) ),
|
||||
) ) );
|
||||
}
|
||||
else {
|
||||
$this->set( 'locale', null );
|
||||
}
|
||||
|
||||
$this->set('file', $file );
|
||||
$this->set('filetype', strtoupper($ext) );
|
||||
$this->set('title', $file->basename() );
|
||||
|
||||
// navigate up to root from this bundle sub view
|
||||
$bundle = $this->getBundle();
|
||||
$breadcrumb = Loco_admin_Navigation::createBreadcrumb( $bundle );
|
||||
$this->set( 'breadcrumb', $breadcrumb );
|
||||
|
||||
// navigate between sub view siblings for this resource
|
||||
$tabs = new Loco_admin_Navigation;
|
||||
$this->set( 'tabs', $tabs );
|
||||
$actions = array (
|
||||
'file-edit' => __('Editor','loco-translate'),
|
||||
'file-view' => __('Source','loco-translate'),
|
||||
'file-info' => __('File info','loco-translate'),
|
||||
'file-diff' => __('Restore','loco-translate'),
|
||||
'file-move' => $localised ? __('Relocate','loco-translate') : null,
|
||||
'file-delete' => __('Delete','loco-translate'),
|
||||
);
|
||||
|
||||
$suffix = $this->get('action');
|
||||
$prefix = $this->get('type');
|
||||
$args = array_intersect_key($_GET,array('path'=>1,'bundle'=>1,'domain'=>1));
|
||||
foreach( $actions as $action => $name ){
|
||||
if( is_string($name) ){
|
||||
$href = Loco_mvc_AdminRouter::generate( $prefix.'-'.$action, $args );
|
||||
$tabs->add( $name, $href, $action === $suffix );
|
||||
}
|
||||
}
|
||||
|
||||
// Provide common language creation link if project scope is is valid
|
||||
try {
|
||||
$project = $this->getProject();
|
||||
$args = array( 'bundle' => $bundle->getHandle(), 'domain' => $project->getId() );
|
||||
$this->set( 'msginit', new Loco_mvc_ViewParams( array (
|
||||
'href' => Loco_mvc_AdminRouter::generate( $prefix.'-msginit', $args ),
|
||||
'text' => __('New language','loco-translate'),
|
||||
) ) );
|
||||
}
|
||||
catch( Exception $e ){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function view( $tpl, array $args = array() ){
|
||||
|
||||
if( $breadcrumb = $this->get('breadcrumb') ){
|
||||
|
||||
// Add project name into breadcrumb if not the same as bundle name
|
||||
try {
|
||||
$project = $this->getProject();
|
||||
if( $project->getName() !== $this->getBundle()->getName() ){
|
||||
$breadcrumb->add( $project->getName() );
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
// ignore missing project in breadcrumb
|
||||
}
|
||||
|
||||
// Always add page title as final breadcrumb element
|
||||
$title = $this->get('title') or $title = 'Untitled';
|
||||
$breadcrumb->add( $title );
|
||||
}
|
||||
|
||||
return parent::view( $tpl, $args );
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
113
vendor/loco-translate/src/admin/file/DeleteController.php
vendored
Normal file
113
vendor/loco-translate/src/admin/file/DeleteController.php
vendored
Normal file
|
@ -0,0 +1,113 @@
|
|||
<?php
|
||||
/**
|
||||
* File delete function
|
||||
*/
|
||||
class Loco_admin_file_DeleteController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* Expand single path to all files that will be deleted
|
||||
* @param Loco_fs_File primary file being deleted, probably the PO
|
||||
* @return array
|
||||
*/
|
||||
private function expandFiles( Loco_fs_File $file ){
|
||||
try {
|
||||
$siblings = new Loco_fs_Siblings( $file );
|
||||
}
|
||||
catch( InvalidArgumentException $e ){
|
||||
$ext = $file->extension();
|
||||
throw new Loco_error_Exception( sprintf('Refusing to delete a %s file', strtoupper($ext) ) );
|
||||
}
|
||||
return $siblings->expand();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$file = $this->get('file');
|
||||
|
||||
// set up form for delete confirmation
|
||||
if( $file->exists() && ! $file->isDirectory() ){
|
||||
// nonce action will be specific to file for extra security
|
||||
// TODO could also add file MD5 to avoid deletion after changes made.
|
||||
$path = $file->getPath();
|
||||
$action = 'delete:'.$path;
|
||||
// set up view now in case of late failure
|
||||
$fields = new Loco_mvc_HiddenFields( array() );
|
||||
$fields->setNonce( $action );
|
||||
$this->set( 'hidden', $fields );
|
||||
// attempt delete if valid nonce posted back
|
||||
if( $this->checkNonce($action) ){
|
||||
$api = new Loco_api_WordPressFileSystem;
|
||||
// delete dependant files first, so master still exists if others fail
|
||||
$files = array_reverse( $this->expandFiles($file) );
|
||||
try {
|
||||
/* @var $trash Loco_fs_File */
|
||||
foreach( $files as $trash ){
|
||||
$api->authorizeDelete($trash);
|
||||
$trash->unlink();
|
||||
}
|
||||
// flash message for display after redirect
|
||||
try {
|
||||
$n = count( $files );
|
||||
Loco_data_Session::get()->flash('success', sprintf( _n('File deleted','%u files deleted',$n,'loco-translate'),$n) );
|
||||
Loco_data_Session::close();
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// tolerate session failure
|
||||
}
|
||||
// redirect to bundle overview
|
||||
$href = Loco_mvc_AdminRouter::generate( $this->get('type').'-view', array( 'bundle' => $this->get('bundle') ) );
|
||||
if( wp_redirect($href) ){
|
||||
exit;
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add( $e );
|
||||
}
|
||||
}
|
||||
}
|
||||
// set page title before render sets inline title
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', sprintf( __('Delete %s','loco-translate'), $file->basename() ).' ‹ '.$bundle->getName() );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$file = $this->get('file');
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
|
||||
$files = $this->expandFiles( $file );
|
||||
$info = Loco_mvc_FileParams::create($file);
|
||||
$this->set( 'info', $info );
|
||||
$this->set( 'title', sprintf( __('Delete %s','loco-translate'), $info->name ) );
|
||||
|
||||
// warn about additional files that will be deleted along with this
|
||||
if( $deps = array_slice($files,1) ){
|
||||
$count = count($deps);
|
||||
$this->set('warn', sprintf( _n( 'One dependent file will also be deleted', '%u dependent files will also be deleted', $count, 'loco-translate' ), $count ) );
|
||||
$infos = array();
|
||||
foreach( $deps as $depfile ){
|
||||
$infos[] = Loco_mvc_FileParams::create( $depfile );
|
||||
}
|
||||
$this->set('deps', $infos );
|
||||
}
|
||||
|
||||
$this->prepareFsConnect( 'delete', $this->get('path') );
|
||||
|
||||
$this->enqueueScript('delete');
|
||||
return $this->view('admin/file/delete');
|
||||
}
|
||||
|
||||
}
|
156
vendor/loco-translate/src/admin/file/DiffController.php
vendored
Normal file
156
vendor/loco-translate/src/admin/file/DiffController.php
vendored
Normal file
|
@ -0,0 +1,156 @@
|
|||
<?php
|
||||
/**
|
||||
* File revisions and rollback
|
||||
*/
|
||||
class Loco_admin_file_DiffController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('podiff');
|
||||
|
||||
$pofile = $this->get('file');
|
||||
if( $pofile->exists() && ! $pofile->isDirectory() ){
|
||||
$path = $pofile->getPath();
|
||||
$action = 'restore:'.$path;
|
||||
// set up view now in case of late failure
|
||||
$fields = new Loco_mvc_HiddenFields( array() );
|
||||
$fields->setNonce( $action );
|
||||
$this->set( 'hidden', $fields );
|
||||
// attempt rollback if valid nonce posted back with backup path
|
||||
if( $this->checkNonce($action) ){
|
||||
try {
|
||||
$post = Loco_mvc_PostParams::get();
|
||||
$api = new Loco_api_WordPressFileSystem;
|
||||
// Restore
|
||||
if( $path = $post->backup ){
|
||||
$target = new Loco_fs_File( $path );
|
||||
$target->normalize( loco_constant('WP_CONTENT_DIR') );
|
||||
// parse PO. we'll need it for MO compile anyway
|
||||
$source = $target->getContents();
|
||||
$data = Loco_gettext_Data::fromSource( $source );
|
||||
// backup current master before restoring
|
||||
$backups = new Loco_fs_Revisions($pofile);
|
||||
if( $num_backups = Loco_data_Settings::get()->num_backups ){
|
||||
$api->authorizeCopy($pofile);
|
||||
$backups->create();
|
||||
}
|
||||
// authorize master for file modification
|
||||
$api->authorizeUpdate($pofile);
|
||||
// recompile binary if it exists
|
||||
$mofile = $pofile->cloneExtension('mo');
|
||||
if( $mofile->exists() ){
|
||||
$mofile->putContents( $data->msgfmt() );
|
||||
}
|
||||
// replacing source file last in case of failures
|
||||
$pofile->putContents( $source );
|
||||
Loco_error_AdminNotices::success( __('File restored','loco-translate') );
|
||||
// prune to configured level after success
|
||||
$backups->prune( $num_backups );
|
||||
$backups = null;
|
||||
}
|
||||
// Delete
|
||||
else if( $path = $post->delete ){
|
||||
$target = new Loco_fs_File( $path );
|
||||
$target->normalize( loco_constant('WP_CONTENT_DIR') );
|
||||
$api->authorizeDelete( $target );
|
||||
$target->unlink();
|
||||
Loco_error_AdminNotices::success( __('File deleted','loco-translate') );
|
||||
}
|
||||
else {
|
||||
throw new Loco_error_Exception('Nothing selected');
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add( $e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', sprintf( __('Restore %s','loco-translate'), $pofile->basename() ).' ‹ '.$bundle->getName() );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$file = $this->get('file');
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
|
||||
$info = Loco_mvc_FileParams::create($file);
|
||||
$info['mtime'] = $file->modified();
|
||||
$this->set( 'master', $info );
|
||||
$this->set( 'title', sprintf( __('Restore %s','loco-translate'), $info->name ) );
|
||||
|
||||
$enabled = Loco_data_Settings::get()->num_backups;
|
||||
$this->set( 'enabled', $enabled );
|
||||
|
||||
$files = array();
|
||||
$wp_content = loco_constant('WP_CONTENT_DIR');
|
||||
$paths = array( $file->getRelativePath($wp_content) );
|
||||
|
||||
$podate = 'pot' === $file->extension() ? 'POT-Creation-Date' : 'PO-Revision-Date';
|
||||
$backups = new Loco_fs_Revisions($file);
|
||||
|
||||
foreach( $backups->getPaths() as $path ){
|
||||
$tmp = new Loco_fs_File( $path );
|
||||
$info = Loco_mvc_FileParams::create($tmp);
|
||||
// time file was snapshotted is actually the time the next version was updated
|
||||
// $info['mtime'] = $backups->getTimestamp($path);
|
||||
// pull "real" update time, meaning when the revision was last updated as current version
|
||||
try {
|
||||
$head = Loco_gettext_Data::head($tmp)->getHeaders();
|
||||
if( $value = $head->trimmed($podate) ){
|
||||
$info['potime'] = Loco_gettext_Data::parseDate($value);
|
||||
}
|
||||
else {
|
||||
throw new Loco_error_Exception('Backup has no '.$podate.' field');
|
||||
}
|
||||
}
|
||||
catch( Exception $e ){
|
||||
Loco_error_AdminNotices::debug( $e->getMessage() );
|
||||
continue;
|
||||
}
|
||||
$paths[] = $tmp->getRelativePath($wp_content);
|
||||
$files[] = $info;
|
||||
}
|
||||
|
||||
// no backups = no restore
|
||||
if( ! $files ){
|
||||
return $this->view('admin/errors/no-backups');
|
||||
}
|
||||
|
||||
/*/ warn if current backup settings aren't enough to restore without losing older revisions
|
||||
$min = count($files) + 1;
|
||||
if( $enabled < $min ){
|
||||
$notice = Loco_error_AdminNotices::info('We recommend enabling more backups before restoring');
|
||||
$notice->addLink( apply_filters('loco_external','https://localise.biz/wordpress/plugin/manual/settings#po'), __('Documentation','loco-translate') )
|
||||
->addLink( Loco_mvc_AdminRouter::generate('config').'#loco--num-backups', __('Settings') );
|
||||
}*/
|
||||
|
||||
// restore permissions required are create and delete on current location
|
||||
$this->prepareFsConnect( 'update', $this->get('path') );
|
||||
|
||||
// prepare revision arguments for JavaScript
|
||||
$this->set( 'js', new Loco_mvc_ViewParams( array(
|
||||
'paths' => $paths,
|
||||
'nonces' => array (
|
||||
'diff' => wp_create_nonce('diff'),
|
||||
)
|
||||
) ) );
|
||||
|
||||
$this->enqueueScript('podiff');
|
||||
return $this->view('admin/file/diff', compact('files','backups') );
|
||||
}
|
||||
|
||||
|
||||
}
|
245
vendor/loco-translate/src/admin/file/EditController.php
vendored
Normal file
245
vendor/loco-translate/src/admin/file/EditController.php
vendored
Normal file
|
@ -0,0 +1,245 @@
|
|||
<?php
|
||||
/**
|
||||
* PO editor view
|
||||
*/
|
||||
class Loco_admin_file_EditController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('editor');
|
||||
//
|
||||
$file = $this->get('file');
|
||||
$bundle = $this->getBundle();
|
||||
// translators: %1$s is the file name, %2$s is the bundle name
|
||||
$this->set('title', sprintf( __('Editing %1$s in %2$s','loco-translate'), $file->basename(), $bundle ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-file-edit'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool whether po files is in read-only mode
|
||||
* @return array
|
||||
*/
|
||||
private function getNonces( $readonly ){
|
||||
$nonces = array();
|
||||
foreach( $readonly ? array('fsReference') : array('sync','save','fsReference','apis') as $name ){
|
||||
$nonces[$name] = wp_create_nonce($name);
|
||||
}
|
||||
return $nonces;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param bool whether po files is in read-only mode
|
||||
* @return array
|
||||
*/
|
||||
private function getApiProviders( $readonly ){
|
||||
return $readonly ? null : array_values( array_filter(Loco_api_Providers::export(),array(__CLASS__,'filterApiProvider') ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @param string[]
|
||||
* @return bool
|
||||
*/
|
||||
private static function filterApiProvider( array $api ){
|
||||
return (bool) $api['key'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// file must exist for editing
|
||||
$file = $this->get('file');
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
|
||||
// editor will be rendered
|
||||
$this->enqueueScript('editor');
|
||||
|
||||
// Parse file data into JavaScript for editor
|
||||
try {
|
||||
$this->set('modified', $file->modified() );
|
||||
$data = Loco_gettext_Data::load( $file );
|
||||
}
|
||||
catch( Exception $e ){
|
||||
Loco_error_AdminNotices::add( Loco_error_Exception::convert($e) );
|
||||
$data = Loco_gettext_Data::dummy();
|
||||
}
|
||||
|
||||
$head = $data->getHeaders();
|
||||
|
||||
// default is to permit editing of any file
|
||||
$readonly = false;
|
||||
|
||||
// Establish if file belongs to a configured project
|
||||
try {
|
||||
$bundle = $this->getBundle();
|
||||
$project = $this->getProject();
|
||||
}
|
||||
// Fine if not, this just means sync isn't possible.
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add( $e );
|
||||
Loco_error_AdminNotices::debug( sprintf("Sync is disabled because this file doesn't relate to a known set of translations", $bundle ) );
|
||||
$project = null;
|
||||
}
|
||||
|
||||
// Establish PO/POT edit mode
|
||||
$potfile = null;
|
||||
$locale = $this->getLocale();
|
||||
if( $locale instanceof Loco_Locale ){
|
||||
// alternative POT file may be forced by PO headers
|
||||
if( $value = $head['X-Loco-Template'] ){
|
||||
$potfile = new Loco_fs_File($value);
|
||||
$potfile->normalize( $bundle->getDirectoryPath() );
|
||||
}
|
||||
// else use project-configured template, assuming there is one
|
||||
// no way to get configured POT if invalid project
|
||||
else if( $project ){
|
||||
$potfile = $project->getPot();
|
||||
// Handle situation where project defines a localised file as the official template
|
||||
if( $potfile && $potfile->equal($file) ){
|
||||
$locale = null;
|
||||
$potfile = null;
|
||||
}
|
||||
}
|
||||
if( $potfile ){
|
||||
// Validate template file as long as it exists
|
||||
if( $potfile->exists() ){
|
||||
try {
|
||||
$potdata = Loco_gettext_Data::load( $potfile );
|
||||
if( ! $potdata->equalSource($data) ){
|
||||
Loco_error_AdminNotices::debug( sprintf( __("Translations don't match template. Run sync to update from %s",'loco-translate'), $potfile->basename() ) );
|
||||
}
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// translators: Where %s is the name of the invalid POT file
|
||||
Loco_error_AdminNotices::warn( sprintf( __('Translation template is invalid (%s)','loco-translate'), $potfile->basename() ) );
|
||||
$potfile = null;
|
||||
}
|
||||
}
|
||||
// else template doesn't exist, so sync will be done to source code
|
||||
else {
|
||||
// Loco_error_AdminNotices::debug( sprintf( __('Template file not found (%s)','loco-translate'), $potfile->basename() ) );
|
||||
$potfile = null;
|
||||
}
|
||||
}
|
||||
if( $locale ){
|
||||
// allow PO file to dictate its own Plural-Forms
|
||||
try {
|
||||
$locale->setPluralFormsHeader( $head['Plural-Forms'] );
|
||||
}
|
||||
catch( InvalidArgumentException $e ){
|
||||
// ignore invalid Plural-Forms
|
||||
}
|
||||
// fill in missing PO headers now locale is fully resolved
|
||||
$data->localize($locale);
|
||||
|
||||
// If MO file will be compiled, check for library/config problems
|
||||
if ( 2 !== strlen( "\xC2\xA3" ) ) {
|
||||
Loco_error_AdminNotices::warn('Your mbstring configuration will result in corrupt MO files. Please ensure mbstring.func_overload is disabled');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$settings = Loco_data_Settings::get();
|
||||
|
||||
if( is_null($locale) ){
|
||||
// notify if template is locked (save and sync will be disabled)
|
||||
if( $project && $project->isPotLocked() ){
|
||||
$this->set('fsDenied', true );
|
||||
$readonly = true;
|
||||
}
|
||||
// translators: Warning when POT file is opened in the file editor. It can be disabled in settings.
|
||||
else if( 1 === $settings->pot_protect ){
|
||||
Loco_error_AdminNotices::warn( __("This is NOT a translation file. Manual editing of source strings is not recommended.",'loco-translate') )
|
||||
->addLink( Loco_mvc_AdminRouter::generate('config').'#loco--pot-protect', __('Settings','loco-translate') )
|
||||
->addLink( apply_filters('loco_external','https://localise.biz/wordpress/plugin/manual/templates'), __('Documentation','loco-translate') );
|
||||
}
|
||||
}
|
||||
|
||||
// back end expects paths relative to wp-content
|
||||
$wp_content = loco_constant('WP_CONTENT_DIR');
|
||||
|
||||
$this->set( 'js', new Loco_mvc_ViewParams( array(
|
||||
'podata' => $data->jsonSerialize(),
|
||||
'powrap' => (int) $settings->po_width,
|
||||
'multipart' => (bool) $settings->ajax_files,
|
||||
'locale' => $locale ? $locale->jsonSerialize() : null,
|
||||
'potpath' => $locale && $potfile ? $potfile->getRelativePath($wp_content) : null,
|
||||
'popath' => $this->get('path'),
|
||||
'readonly' => $readonly,
|
||||
'project' => $project ? array (
|
||||
'bundle' => $bundle->getId(),
|
||||
'domain' => (string) $project->getId(),
|
||||
) : null,
|
||||
'nonces' => $this->getNonces($readonly),
|
||||
'apis' => $locale ? $this->getApiProviders($readonly) : null,
|
||||
) ) );
|
||||
$this->set( 'ui', new Loco_mvc_ViewParams( array(
|
||||
// Translators: button for adding a new string when manually editing a POT file
|
||||
'add' => _x('Add','Editor','loco-translate'),
|
||||
// Translators: button for removing a string when manually editing a POT file
|
||||
'del' => _x('Remove','Editor','loco-translate'),
|
||||
'help' => __('Help','loco-translate'),
|
||||
// Translators: Button that saves translations to disk
|
||||
'save' => _x('Save','Editor','loco-translate'),
|
||||
// Translators: Button that runs in-editor sync/operation
|
||||
'sync' => _x('Sync','Editor','loco-translate'),
|
||||
// Translators: Button that reloads current screen
|
||||
'revert' => _x('Revert','Editor','loco-translate'),
|
||||
// Translators: Button that opens window for auto-translating
|
||||
'auto' => _x('Auto','Editor','loco-translate'),
|
||||
// Translators: Button for downloading a PO, MO or POT file
|
||||
'download' => _x('Download','Editor','loco-translate'),
|
||||
// Translators: Placeholder text for text filter above editor
|
||||
'filter' => __('Filter translations','loco-translate'),
|
||||
// Translators: Button that toggles invisible characters
|
||||
'invs' => _x('Toggle invisibles','Editor','loco-translate'),
|
||||
// Translators: Button that toggles between "code" and regular text editing modes
|
||||
'code' => _x('Toggle code view','Editor','loco-translate'),
|
||||
) ) );
|
||||
|
||||
// Download form params
|
||||
$hidden = new Loco_mvc_HiddenFields( array(
|
||||
'path' => '',
|
||||
'source' => '',
|
||||
'route' => 'download',
|
||||
'action' => 'loco_download',
|
||||
) );
|
||||
$this->set( 'dlFields', $hidden->setNonce('download') );
|
||||
$this->set( 'dlAction', admin_url('admin-ajax.php','relative') );
|
||||
|
||||
// Remote file system required if file is not directly writable
|
||||
$this->prepareFsConnect( 'update', $this->get('path') );
|
||||
|
||||
// set simpler title for breadcrumb
|
||||
$this->set('title', $file->basename() );
|
||||
|
||||
// ok to render editor as either po or pot
|
||||
$tpl = $locale ? 'po' : 'pot';
|
||||
return $this->view( 'admin/file/edit-'.$tpl, array() );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
201
vendor/loco-translate/src/admin/file/InfoController.php
vendored
Normal file
201
vendor/loco-translate/src/admin/file/InfoController.php
vendored
Normal file
|
@ -0,0 +1,201 @@
|
|||
<?php
|
||||
/**
|
||||
* File info / management view.
|
||||
*/
|
||||
class Loco_admin_file_InfoController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('fileinfo');
|
||||
//
|
||||
$file = $this->get('file');
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', $file->basename().' ‹ '.$bundle->getName() );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-file-info'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$file = $this->get('file');
|
||||
$name = $file->basename();
|
||||
$this->set('title', $name );
|
||||
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
|
||||
// file info
|
||||
$ext = strtolower( $file->extension() );
|
||||
$finfo = Loco_mvc_FileParams::create( $file );
|
||||
$this->set('file', $finfo );
|
||||
$finfo['type'] = strtoupper($ext);
|
||||
if( $file->exists() ){
|
||||
$finfo['existent'] = true;
|
||||
$finfo['writable'] = $file->writable();
|
||||
$finfo['deletable'] = $file->deletable();
|
||||
$finfo['mtime'] = $file->modified();
|
||||
// Notify if file is managed by WordPress
|
||||
$api = new Loco_api_WordPressFileSystem;
|
||||
if( $api->isAutoUpdatable($file) ){
|
||||
$finfo['autoupdate'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// location info
|
||||
$dir = new Loco_fs_LocaleDirectory( $file->dirname() );
|
||||
$dinfo = Loco_mvc_FileParams::create( $dir );
|
||||
$this->set('dir', $dinfo );
|
||||
$dinfo['type'] = $dir->getTypeId();
|
||||
if( $dir->exists() && $dir->isDirectory() ){
|
||||
$dinfo['existent'] = true;
|
||||
$dinfo['writable'] = $dir->writable();
|
||||
}
|
||||
|
||||
// collect note worthy problems with file headers
|
||||
$debugging = loco_debugging();
|
||||
$debug = array();
|
||||
|
||||
// get the name of the web server for information purposes
|
||||
$this->set('httpd', Loco_compat_PosixExtension::getHttpdUser() );
|
||||
|
||||
// unknown file template if required
|
||||
$locale = null;
|
||||
$project = null;
|
||||
$tpl = 'admin/file/info-other';
|
||||
|
||||
// we should know the project the file belongs to, but permitting orphans for debugging
|
||||
try {
|
||||
$project = $this->getProject();
|
||||
$template = $project->getPot();
|
||||
$isTemplate = $template && $file->equal($template);
|
||||
$this->set('isTemplate', $isTemplate );
|
||||
$this->set('project', $project );
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
$debug[] = $e->getMessage();
|
||||
$isTemplate = false;
|
||||
$template = null;
|
||||
}
|
||||
|
||||
// file will be Gettext most likely
|
||||
if( 'pot' === $ext || 'po' === $ext || 'mo' === $ext ){
|
||||
// treat as template until locale verified
|
||||
$tpl = 'admin/file/info-pot';
|
||||
// don't attempt to pull locale of template file
|
||||
if( 'pot' !== $ext && ! $isTemplate ){
|
||||
$locale = $file->getLocale();
|
||||
$code = (string) $locale;
|
||||
if( $locale->isValid() ){
|
||||
// find PO/MO counter parts
|
||||
if( 'po' === $ext ){
|
||||
$tpl = 'admin/file/info-po';
|
||||
$sibling = $file->cloneExtension('mo');
|
||||
}
|
||||
else {
|
||||
$tpl = 'admin/file/info-mo';
|
||||
$sibling = $file->cloneExtension('po');
|
||||
}
|
||||
$info = Loco_mvc_FileParams::create($sibling);
|
||||
$this->set( 'sibling', $info );
|
||||
if( $sibling->exists() ){
|
||||
$info['existent'] = true;
|
||||
$info['writable'] = $sibling->writable();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Do full parse to get stats and headers
|
||||
try {
|
||||
$data = Loco_gettext_Data::load($file);
|
||||
$head = $data->getHeaders();
|
||||
$author = $head->trimmed('Last-Translator') or $author = __('Unknown author','loco-translate');
|
||||
$this->set( 'author', $author );
|
||||
// date headers may not be same as file modification time (files copied to server etc..)
|
||||
$podate = $head->trimmed( $locale ? 'PO-Revision-Date' : 'POT-Creation-Date' );
|
||||
$potime = Loco_gettext_Data::parseDate($podate) or $potime = $file->modified();
|
||||
$this->set('potime', $potime );
|
||||
// access to meta stats, normally cached on listing pages
|
||||
$meta = Loco_gettext_Metadata::create($file,$data);
|
||||
$this->set( 'meta', $meta );
|
||||
// allow PO header to specify alternative template for sync
|
||||
if( $head->has('X-Loco-Template') ){
|
||||
$altpot = new Loco_fs_File($head['X-Loco-Template']);
|
||||
$altpot->normalize( $this->getBundle()->getDirectoryPath() );
|
||||
if( $altpot->exists() && ( ! $template || ! $template->equal($altpot) ) ){
|
||||
$template = $altpot;
|
||||
}
|
||||
}
|
||||
// establish whether PO is in sync with POT
|
||||
if( $template && ! $isTemplate && 'po' === $ext && $template->exists() ){
|
||||
try {
|
||||
$this->set('potfile', new Loco_mvc_FileParams( array(
|
||||
'synced' => Loco_gettext_Data::load($template)->equalSource($data),
|
||||
), $template ) );
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// ignore invalid template in this context
|
||||
}
|
||||
}
|
||||
if( $debugging ){
|
||||
// missing or invalid headers are tollerated but developers should be notified
|
||||
if( $debugging && ! count($head) ){
|
||||
$debug[] = __('File does not have a valid header','loco-translate');
|
||||
}
|
||||
// Language header sanity checks, raising developer (debug) warnings
|
||||
if( $locale ){
|
||||
if( $value = $head['Language'] ){
|
||||
$check = (string) Loco_Locale::parse($value);
|
||||
if( $check !== $code ){
|
||||
$debug[]= sprintf( __('Language header is "%s" but file name contains "%s"','loco-translate'), $value, $code );
|
||||
}
|
||||
}
|
||||
if( $value = $head['Plural-Forms'] ){
|
||||
try {
|
||||
$locale->setPluralFormsHeader($value);
|
||||
}
|
||||
catch( InvalidArgumentException $e ){
|
||||
$debug[] = sprintf('Plural-Forms header is invalid, "%s"',$value);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Other sanity checks
|
||||
if( $project && ( $value = $head['Project-Id-Version'] ) && $value !== $project->getName() ){
|
||||
$debug[] = sprintf('Project-Id-Version header is "%s" but project is "%s"', $value, $project );
|
||||
}
|
||||
}
|
||||
// Count source text for templates only (assumed English)
|
||||
if( 'admin/file/info-pot' === $tpl ){
|
||||
$counter = new Loco_gettext_WordCount($data);
|
||||
$this->set('words', $counter->count() );
|
||||
}
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
$this->set('error', $e->getMessage() );
|
||||
$tpl = 'admin/file/info-other';
|
||||
}
|
||||
}
|
||||
|
||||
if( $debugging && $debug ){
|
||||
$this->set( 'debug', new Loco_mvc_ViewParams($debug) );
|
||||
}
|
||||
|
||||
return $this->view( $tpl );
|
||||
}
|
||||
|
||||
}
|
185
vendor/loco-translate/src/admin/file/MoveController.php
vendored
Normal file
185
vendor/loco-translate/src/admin/file/MoveController.php
vendored
Normal file
|
@ -0,0 +1,185 @@
|
|||
<?php
|
||||
/**
|
||||
* Translation set relocation tool.
|
||||
* Moves PO/MO pair and all related files to a new location
|
||||
*/
|
||||
class Loco_admin_file_MoveController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$file = $this->get('file');
|
||||
/* @var Loco_fs_File $file */
|
||||
if( $file->exists() && ! $file->isDirectory() ){
|
||||
$files = new Loco_fs_Siblings($file);
|
||||
// nonce action will be specific to file for extra security
|
||||
$path = $file->getPath();
|
||||
$action = 'move:'.$path;
|
||||
// set up view now in case of late failure
|
||||
$fields = new Loco_mvc_HiddenFields( array() );
|
||||
$fields->setNonce( $action );
|
||||
$fields['auth'] = 'move';
|
||||
$fields['path'] = $this->get('path');
|
||||
$this->set('hidden',$fields );
|
||||
// attempt move if valid nonce posted back
|
||||
while( $this->checkNonce($action) ){
|
||||
// Chosen location should be valid as a posted "dest" parameter
|
||||
if( ! Loco_mvc_PostParams::get()->has('dest') ){
|
||||
Loco_error_AdminNotices::err('No destination posted');
|
||||
break;
|
||||
}
|
||||
$target = new Loco_fs_LocaleFile( Loco_mvc_PostParams::get()->dest );
|
||||
$ext = $target->extension();
|
||||
// primary file extension should only be permitted to change between po and pot
|
||||
if( $ext !== $file->extension() && 'po' !== $ext && 'pot' !== $ext ){
|
||||
Loco_error_AdminNotices::err('Invalid file extension, *.po or *.pot only');
|
||||
break;
|
||||
}
|
||||
$target->normalize( loco_constant('WP_CONTENT_DIR') );
|
||||
$target_dir = $target->getParent()->getPath();
|
||||
// Primary file gives template remapping, so all files are renamed with same stub.
|
||||
// this can only be one of three things: (en -> en) or (foo-en -> en) or (en -> foo-en)
|
||||
// suffix will then consist of file extension, plus any other stuff like backup file date.
|
||||
$target_base = $target->filename();
|
||||
$source_snip = strlen( $file->filename() );
|
||||
// buffer all files to move to preempt write failures
|
||||
$movable = array();
|
||||
$api = new Loco_api_WordPressFileSystem;
|
||||
foreach( $files->expand() as $source ){
|
||||
$suffix = substr( $source->basename(), $source_snip ); // <- e.g. "-backup.po~"
|
||||
$target = new Loco_fs_File( $target_dir.'/'.$target_base.$suffix );
|
||||
// permit valid change of file extension on primary source file (po/pot)
|
||||
if( $source === $files->getSource() && $target->extension() !== $ext ){
|
||||
$target = $target->cloneExtension($ext);
|
||||
}
|
||||
if( ! $api->authorizeMove($source,$target) ) {
|
||||
Loco_error_AdminNotices::err('Failed to authorize relocation of '.$source->basename() );
|
||||
break 2;
|
||||
}
|
||||
$movable[] = array($source,$target);
|
||||
}
|
||||
// commit moves. If any fail we'll have separated the files, which is bad
|
||||
$count = 0;
|
||||
$total = count($movable);
|
||||
foreach( $movable as $pair ){
|
||||
try {
|
||||
$pair[0]->move( $pair[1] );
|
||||
$count++;
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::add($e);
|
||||
}
|
||||
}
|
||||
// flash messages for display after redirect
|
||||
try {
|
||||
if( $count ) {
|
||||
Loco_data_Session::get()->flash( 'success', sprintf( _n( 'File moved', '%u files moved', $total, 'loco-translate' ), $total ) );
|
||||
}
|
||||
if( $total > $count ){
|
||||
$diff = $total - $count;
|
||||
Loco_data_Session::get()->flash( 'error', sprintf( _n( 'One file could not be moved', '%u files could not be moved', $diff, 'loco-translate' ), $diff ) );
|
||||
}
|
||||
Loco_data_Session::close();
|
||||
}
|
||||
catch( Exception $e ){
|
||||
// tolerate session failure
|
||||
}
|
||||
// redirect to bundle overview
|
||||
$href = Loco_mvc_AdminRouter::generate( $this->get('type').'-view', array( 'bundle' => $this->get('bundle') ) );
|
||||
if( wp_redirect($href) ){
|
||||
exit;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// set page title before render sets inline title
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', sprintf( __('Move %s','loco-translate'), $file->basename() ).' ‹ '.$bundle->getName() );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
$file = $this->get('file');
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
// relocation requires knowing text domain and locale
|
||||
try {
|
||||
$project = $this->getProject();
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
Loco_error_AdminNotices::warn($e->getMessage());
|
||||
$project = null;
|
||||
}
|
||||
$files = new Loco_fs_Siblings($file);
|
||||
$file = new Loco_fs_LocaleFile( $files->getSource() );
|
||||
$locale = $file->getLocale();
|
||||
// switch between canonical move and custom file path mode
|
||||
$custom = is_null($project) || $this->get('custom') || 'po' !== $file->extension() || ! $locale->isValid();
|
||||
// common page elements:
|
||||
$this->set('files',$files->expand() );
|
||||
$this->set('title', sprintf( __('Move %s','loco-translate'), $file->filename() ) );
|
||||
$this->enqueueScript('move');
|
||||
// set info for existing file location
|
||||
$content_dir = loco_constant('WP_CONTENT_DIR');
|
||||
$current = $file->getRelativePath($content_dir);
|
||||
$parent = new Loco_fs_LocaleDirectory( $file->dirname() );
|
||||
$typeId = $parent->getTypeId();
|
||||
$this->set('current', new Loco_mvc_ViewParams(array(
|
||||
'path' => $parent->getRelativePath($content_dir),
|
||||
'type' => $parent->getTypeLabel($typeId),
|
||||
)) );
|
||||
// moving files will require deletion permission on current file location
|
||||
// plus write permission on target location, but we don't know what that is yet.
|
||||
$fields = $this->prepareFsConnect('move',$current);
|
||||
$fields['path'] = '';
|
||||
$fields['dest'] = '';
|
||||
// custom file move template (POT mode)
|
||||
if( $custom ){
|
||||
$this->get('hidden')->offsetSet('custom','1');
|
||||
$this->set('file', Loco_mvc_FileParams::create($file) );
|
||||
return $this->view('admin/file/move-pot');
|
||||
}
|
||||
// establish valid locations for translation set, which may include current:
|
||||
$filechoice = $project->initLocaleFiles($locale);
|
||||
// start with current location so always first in list
|
||||
$locations = array();
|
||||
$locations[$typeId] = new Loco_mvc_ViewParams( array(
|
||||
'label' => $parent->getTypeLabel($typeId),
|
||||
'paths' => array( new Loco_mvc_ViewParams( array(
|
||||
'path' => $current,
|
||||
'active' => true,
|
||||
) ) )
|
||||
) );
|
||||
/* @var Loco_fs_File $pofile */
|
||||
foreach( $filechoice as $pofile ){
|
||||
$relpath = $pofile->getRelativePath($content_dir);
|
||||
if( $current === $relpath ){
|
||||
continue;
|
||||
}
|
||||
// initialize location type (system, etc..)
|
||||
$parent = new Loco_fs_LocaleDirectory( $pofile->dirname() );
|
||||
$typeId = $parent->getTypeId();
|
||||
if( ! isset($locations[$typeId]) ){
|
||||
$locations[$typeId] = new Loco_mvc_ViewParams( array(
|
||||
'label' => $parent->getTypeLabel($typeId),
|
||||
'paths' => array(),
|
||||
) );
|
||||
}
|
||||
$choice = new Loco_mvc_ViewParams( array(
|
||||
'path' => $relpath,
|
||||
) );
|
||||
$locations[$typeId]['paths'][] = $choice;
|
||||
}
|
||||
$this->set('locations', $locations );
|
||||
$this->set('advanced', $_SERVER['REQUEST_URI'].'&custom=1' );
|
||||
return $this->view('admin/file/move-po');
|
||||
}
|
||||
|
||||
}
|
101
vendor/loco-translate/src/admin/file/ViewController.php
vendored
Normal file
101
vendor/loco-translate/src/admin/file/ViewController.php
vendored
Normal file
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
/**
|
||||
* File view / source formatted view.
|
||||
*/
|
||||
class Loco_admin_file_ViewController extends Loco_admin_file_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('poview');
|
||||
//
|
||||
$file = $this->get('file');
|
||||
$bundle = $this->getBundle();
|
||||
$this->set( 'title', 'Source of '.$file->basename().' ‹ '.$bundle->getName() );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-file-view'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// file must exist for editing
|
||||
/* @var Loco_fs_File $file */
|
||||
$file = $this->get('file');
|
||||
$name = $file->basename();
|
||||
$type = strtolower( $file->extension() );
|
||||
$this->set('title', $name );
|
||||
|
||||
if( $fail = $this->getFileError($file) ){
|
||||
return $fail;
|
||||
}
|
||||
|
||||
// Establish if file belongs to a configured project
|
||||
try {
|
||||
$bundle = $this->getBundle();
|
||||
$project = $this->getProject();
|
||||
}
|
||||
catch( Exception $e ){
|
||||
$project = null;
|
||||
}
|
||||
|
||||
// Parse data before rendering, so we know it's a valid Gettext format
|
||||
try {
|
||||
$this->set('modified', $file->modified() );
|
||||
$data = Loco_gettext_Data::load( $file );
|
||||
}
|
||||
catch( Loco_error_ParseException $e ){
|
||||
Loco_error_AdminNotices::add( Loco_error_Exception::convert($e) );
|
||||
$data = Loco_gettext_Data::dummy();
|
||||
}
|
||||
|
||||
$this->set( 'meta', Loco_gettext_Metadata::create($file, $data) );
|
||||
|
||||
// binary MO will be hex-formatted in template
|
||||
if( 'mo' === $type ){
|
||||
$this->set('bin', $file->getContents() );
|
||||
return $this->view('admin/file/view-mo' );
|
||||
}
|
||||
|
||||
// else is a PO or POT file
|
||||
$this->enqueueScript('poview');//->enqueueScript('min/highlight');
|
||||
$lines = preg_split('/(?:\\n|\\r\\n?)/', Loco_gettext_Data::ensureUtf8( $file->getContents() ) );
|
||||
$this->set( 'lines', $lines );
|
||||
|
||||
// ajax parameters required for pulling reference sources
|
||||
$this->set('js', new Loco_mvc_ViewParams( array (
|
||||
'popath' => $this->get('path'),
|
||||
'nonces' => array(
|
||||
'fsReference' => wp_create_nonce('fsReference'),
|
||||
),
|
||||
'project' => $bundle ? array (
|
||||
'bundle' => $bundle->getId(),
|
||||
'domain' => $project ? $project->getId() : '',
|
||||
) : null,
|
||||
) ) );
|
||||
|
||||
|
||||
// treat as PO if file name has locale
|
||||
if( $this->getLocale() ){
|
||||
return $this->view('admin/file/view-po' );
|
||||
}
|
||||
|
||||
// else view as POT
|
||||
return $this->view('admin/file/view-pot' );
|
||||
}
|
||||
|
||||
}
|
0
vendor/loco-translate/src/admin/init/BaseController.php
vendored
Normal file
0
vendor/loco-translate/src/admin/init/BaseController.php
vendored
Normal file
327
vendor/loco-translate/src/admin/init/InitPoController.php
vendored
Normal file
327
vendor/loco-translate/src/admin/init/InitPoController.php
vendored
Normal file
|
@ -0,0 +1,327 @@
|
|||
<?php
|
||||
/**
|
||||
* pre-msginit function. Prepares arguments for creating a new PO language file
|
||||
*/
|
||||
class Loco_admin_init_InitPoController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('poinit');
|
||||
//
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', __('New language','loco-translate').' ‹ '.$bundle );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-init-po'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Sort to the left the best option for saving new translation files
|
||||
* @return Loco_mvc_ViewParams
|
||||
*/
|
||||
private function sortPreferred( array $choices ){
|
||||
usort( $choices, array(__CLASS__,'_onSortPreferred') );
|
||||
$best = current( $choices );
|
||||
if( $best && ! $best['disabled'] ){
|
||||
return $best;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function _onSortPreferred( Loco_mvc_ViewParams $a, Loco_mvc_ViewParams $b ){
|
||||
$x = self::scoreFileChoice($a);
|
||||
$y = self::scoreFileChoice($b);
|
||||
return $x === $y ? 0 : ( $x > $y ? -1 : 1 );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Score an individual file choice for sorting preferred
|
||||
* @return int
|
||||
*/
|
||||
private static function scoreFileChoice( Loco_mvc_ViewParams $p ){
|
||||
$score = 0;
|
||||
if( $p['writable'] ){
|
||||
$score++;
|
||||
}
|
||||
if( $p['disabled'] ){
|
||||
$score -= 2;
|
||||
}
|
||||
if( $p['systype'] ){
|
||||
$score--;
|
||||
}
|
||||
return $score;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function _onSortLocationKeys( $a, $b ){
|
||||
static $order = array('custom' => 4, 'wplang' => 3, 'theme' => 2, 'plugin' => 2, 'other' => 1 );
|
||||
$x = $order[$a];
|
||||
$y = $order[$b];
|
||||
return $x === $y ? 0 : ( $x > $y ? -1 : 1 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$breadcrumb = $this->prepareNavigation();
|
||||
// "new" tab is confusing when no project-scope navigation
|
||||
// $this->get('tabs')->add( __('New PO','loco-translate'), '', true );
|
||||
|
||||
// bundle mandatory, but project optional
|
||||
$bundle = $this->getBundle();
|
||||
|
||||
try {
|
||||
$project = $this->getProject();
|
||||
$slug = $project->getSlug();
|
||||
$domain = (string) $project->getDomain();
|
||||
$subhead = sprintf( __('Initializing new translations in "%s"','loco-translate'), $slug?$slug:$domain );
|
||||
}
|
||||
catch( Loco_error_Exception $e ){
|
||||
$project = null;
|
||||
$subhead = __('Initializing new translations in unknown set','loco-translate');
|
||||
}
|
||||
|
||||
$title = __('New language','loco-translate');
|
||||
$this->set('subhead', $subhead );
|
||||
|
||||
// navigate up to bundle listing page
|
||||
$breadcrumb->add( $title );
|
||||
$this->set( 'breadcrumb', $breadcrumb );
|
||||
|
||||
// default locale is a placeholder
|
||||
$locale = new Loco_Locale('zxx');
|
||||
$content_dir = untrailingslashit( loco_constant('WP_CONTENT_DIR') );
|
||||
$copying = false;
|
||||
|
||||
// Permit using any provided file a template instead of POT
|
||||
if( $potpath = $this->get('path') ){
|
||||
$potfile = new Loco_fs_LocaleFile($potpath);
|
||||
$potfile->normalize( $content_dir );
|
||||
if( ! $potfile->exists() ){
|
||||
throw new Loco_error_Exception('Forced template argument must exist');
|
||||
}
|
||||
$copying = true;
|
||||
// forced source could be a POT (although UI would normally prevent it)
|
||||
if( $potfile->getSuffix() ){
|
||||
$locale = $potfile->getLocale();
|
||||
$this->set('sourceLocale', $locale );
|
||||
}
|
||||
}
|
||||
// else project not configured. UI should prevent this by not offering msginit
|
||||
else if( ! $project ){
|
||||
throw new Loco_error_Exception('Cannot add new language to unconfigured set');
|
||||
}
|
||||
// else POT file may or may not be known, and may or may not exist
|
||||
else {
|
||||
$potfile = $project->getPot();
|
||||
}
|
||||
|
||||
|
||||
$locales = array();
|
||||
$installed = array();
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
// pull installed list first, this will include en_US and any non-standard languages installed
|
||||
foreach( $api->getInstalledCore() as $tag ){
|
||||
$locale = Loco_Locale::parse($tag);
|
||||
if( $locale->isValid() ){
|
||||
$tag = (string) $tag;
|
||||
// We may not have names for these, so just the language tag will show
|
||||
$installed[$tag] = new Loco_mvc_ViewParams( array(
|
||||
'value' => $tag,
|
||||
'icon' => $locale->getIcon(),
|
||||
'label' => $locale->ensureName($api),
|
||||
) );
|
||||
}
|
||||
}
|
||||
// pull the same list of "available" languages as used in WordPress settings
|
||||
/* @var $locale Loco_Locale */
|
||||
foreach( $api->getAvailableCore() as $tag => $locale ){
|
||||
if( ! array_key_exists($tag,$installed) ){
|
||||
$locales[$tag] = new Loco_mvc_ViewParams( array(
|
||||
'value' => $tag,
|
||||
'icon' => $locale->getIcon(),
|
||||
'label' => $locale->ensureName($api),
|
||||
) );
|
||||
}
|
||||
}
|
||||
|
||||
// two locale lists built for "installed" and "available" dropdowns
|
||||
$this->set( 'locales', $locales );
|
||||
$this->set( 'installed', $installed );
|
||||
|
||||
// Critical that user selects the correct save location:
|
||||
if( $project ){
|
||||
$filechoice = $project->initLocaleFiles( $locale );
|
||||
}
|
||||
// without configured project we will only allow save to same location
|
||||
else {
|
||||
$filechoice = new Loco_fs_FileList;
|
||||
}
|
||||
|
||||
|
||||
// show information about POT file if we are initializing from template
|
||||
if( $potfile && $potfile->exists() ){
|
||||
$meta = Loco_gettext_Metadata::load($potfile);
|
||||
$total = $meta->getTotal();
|
||||
$summary = sprintf( _n('One string found in %2$s','%s strings found in %s',$total,'loco-translate'), number_format($total), $potfile->basename() );
|
||||
$this->set( 'pot', new Loco_mvc_ViewParams( array(
|
||||
'name' => $potfile->basename(),
|
||||
'path' => $meta->getPath(false),
|
||||
) ) );
|
||||
// if copying an existing PO file, we can fairly safely establish the correct prefixing
|
||||
if( $copying ){
|
||||
$poname = ( $prefix = $potfile->getPrefix() ) ? sprintf('%s-%s.po',$prefix,$locale) : sprintf('%s.po',$locale);
|
||||
$pofile = new Loco_fs_LocaleFile( $poname );
|
||||
$pofile->normalize( $potfile->dirname() );
|
||||
$filechoice->add( $pofile );
|
||||
}
|
||||
/// else if POT is in a folder we don't know about, we may as well add to the choices
|
||||
// TODO this means another utility function in project for prefixing rules on individual location
|
||||
}
|
||||
// else no template exists, so we prompt to extract from source
|
||||
else {
|
||||
$this->set( 'ext', new Loco_mvc_ViewParams( array(
|
||||
'link' => Loco_mvc_AdminRouter::generate( $this->get('type').'-xgettext', $_GET ),
|
||||
'text' => __('Create template','loco-translate'),
|
||||
) ) );
|
||||
// if forcing source extraction show brief description of source files
|
||||
if( $this->get('extract') ){
|
||||
// Tokenizer required for string extraction
|
||||
if( ! loco_check_extension('tokenizer') ){
|
||||
return $this->view('admin/errors/no-tokenizer');
|
||||
}
|
||||
$nfiles = count( $project->findSourceFiles() );
|
||||
$summary = sprintf( _n('1 source file will be scanned for translatable strings','%s source files will be scanned for translatable strings',$nfiles,'loco-translate'), number_format_i18n($nfiles) );
|
||||
}
|
||||
// else prompt for template creation before continuing
|
||||
else {
|
||||
$this->set( 'skip', new Loco_mvc_ViewParams( array(
|
||||
'link' => Loco_mvc_AdminRouter::generate( $this->get('_route'), $_GET + array( 'extract' => '1' ) ),
|
||||
'text' => __('Skip template','loco-translate'),
|
||||
) ) );
|
||||
// POT could still be defined, it might just not exist yet
|
||||
if( $potfile ){
|
||||
$this->set('pot', Loco_mvc_FileParams::create($potfile) );
|
||||
}
|
||||
// else offer assignment of a new file
|
||||
else {
|
||||
$this->set( 'conf', new Loco_mvc_ViewParams( array(
|
||||
'link' => Loco_mvc_AdminRouter::generate( $this->get('type').'-conf', array_intersect_key($_GET,array('bundle'=>'')) ),
|
||||
'text' => __('Assign template','loco-translate'),
|
||||
) ) );
|
||||
}
|
||||
return $this->view('admin/init/init-prompt');
|
||||
}
|
||||
}
|
||||
$this->set( 'summary', $summary );
|
||||
|
||||
// group established locations into types (official, etc..)
|
||||
// there is no point checking whether any of these file exist, because we don't know what language will be chosen yet.
|
||||
$sortable = array();
|
||||
$locations = array();
|
||||
$fs_protect = Loco_data_Settings::get()->fs_protect;
|
||||
$fs_failure = null;
|
||||
/* @var Loco_fs_File $pofile */
|
||||
foreach( $filechoice as $pofile ){
|
||||
$parent = new Loco_fs_LocaleDirectory( $pofile->dirname() );
|
||||
$systype = $parent->getUpdateType();
|
||||
$typeId = $parent->getTypeId();
|
||||
if( ! isset($locations[$typeId]) ){
|
||||
$locations[$typeId] = new Loco_mvc_ViewParams( array(
|
||||
'label' => $parent->getTypeLabel( $typeId ),
|
||||
'paths' => array(),
|
||||
) );
|
||||
}
|
||||
// folder may be unwritable (requiring connect to create file) or may be denied under security settings
|
||||
try {
|
||||
$context = $parent->getWriteContext()->authorize();
|
||||
$writable = $context->writable();
|
||||
$disabled = false;
|
||||
}
|
||||
catch( Loco_error_WriteException $e ){
|
||||
$fs_failure = $e->getMessage();
|
||||
$writable = false;
|
||||
$disabled = true;
|
||||
}
|
||||
$choice = new Loco_mvc_ViewParams( array (
|
||||
'checked' => '',
|
||||
'writable' => $writable,
|
||||
'disabled' => $disabled,
|
||||
'systype' => $systype,
|
||||
'parent' => Loco_mvc_FileParams::create( $parent ),
|
||||
'hidden' => $pofile->getRelativePath($content_dir),
|
||||
'holder' => str_replace( (string) $locale, '<span><locale></span>', $pofile->basename() ),
|
||||
) );
|
||||
// may need to show system file warnings
|
||||
if( $systype && $fs_protect ){
|
||||
$choice['syswarn'] = true;
|
||||
}
|
||||
$sortable[] = $choice;
|
||||
$locations[$typeId]['paths'][] = $choice;
|
||||
}
|
||||
|
||||
// display locations in runtime preference order
|
||||
uksort( $locations, array(__CLASS__,'_onSortLocationKeys') );
|
||||
$this->set( 'locations', $locations );
|
||||
|
||||
// pre-select best (safest/writable) option
|
||||
if( $preferred = $this->sortPreferred( $sortable ) ){
|
||||
$preferred['checked'] = 'checked';
|
||||
}
|
||||
// else show total lock message. probably file mods disallowed
|
||||
else if( $fs_failure ){
|
||||
$this->set('fsLocked', $fs_failure );
|
||||
}
|
||||
|
||||
// hidden fields to pass through to Ajax endpoint
|
||||
$this->set('hidden', new Loco_mvc_HiddenFields( array(
|
||||
'action' => 'loco_json',
|
||||
'route' => 'msginit',
|
||||
'loco-nonce' => $this->setNonce('msginit')->value,
|
||||
'type' => $bundle->getType(),
|
||||
'bundle' => $bundle->getHandle(),
|
||||
'domain' => $project ? $project->getId() : '',
|
||||
'source' => $potpath,
|
||||
) ) );
|
||||
|
||||
$this->set('help', new Loco_mvc_ViewParams( array(
|
||||
'href' => apply_filters('loco_external','https://localise.biz/wordpress/plugin/manual/msginit'),
|
||||
'text' => __("What's this?",'loco-translate'),
|
||||
) ) );
|
||||
|
||||
// file system prompts will be handled when paths are selected (i.e. we don't have one yet)
|
||||
$this->prepareFsConnect( 'create', '' );
|
||||
|
||||
$this->enqueueScript('poinit');
|
||||
return $this->view( 'admin/init/init-po', array() );
|
||||
}
|
||||
|
||||
|
||||
}
|
151
vendor/loco-translate/src/admin/init/InitPotController.php
vendored
Normal file
151
vendor/loco-translate/src/admin/init/InitPotController.php
vendored
Normal file
|
@ -0,0 +1,151 @@
|
|||
<?php
|
||||
/**
|
||||
* pre-xgettext function. Initializes a new PO file for a given locale
|
||||
*/
|
||||
class Loco_admin_init_InitPotController extends Loco_admin_bundle_BaseController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('poinit');
|
||||
//
|
||||
$bundle = $this->getBundle();
|
||||
$this->set('title', __('New template','loco-translate').' ‹ '.$bundle );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-init-pot'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$breadcrumb = $this->prepareNavigation();
|
||||
// "new" tab is confusing when no project-scope navigation
|
||||
// $this->get('tabs')->add( __('New POT','loco-translate'), '', true );
|
||||
|
||||
$bundle = $this->getBundle();
|
||||
$project = $this->getProject();
|
||||
|
||||
$slug = $project->getSlug();
|
||||
$domain = (string) $project->getDomain();
|
||||
$this->set('domain', $domain );
|
||||
|
||||
// Tokenizer required for string extraction
|
||||
if( ! loco_check_extension('tokenizer') ){
|
||||
return $this->view('admin/errors/no-tokenizer');
|
||||
}
|
||||
|
||||
// Establish default POT path whether it exists or not
|
||||
$pot = $project->getPot();
|
||||
while( ! $pot ){
|
||||
$name = ( $slug ? $slug : $domain ).'.pot';
|
||||
/* @var $dir Loco_fs_Directory */
|
||||
foreach( $project->getConfiguredTargets() as $dir ){
|
||||
$pot = new Loco_fs_File( $dir->getPath().'/'.$name );
|
||||
break 2;
|
||||
}
|
||||
// unlikely to have no configured targets, but possible ... so default to standard
|
||||
$pot = new Loco_fs_File( $bundle->getDirectoryPath().'/languages/'.$name );
|
||||
break;
|
||||
}
|
||||
|
||||
// POT should actually not exist at this stage. It should be edited instead.
|
||||
if( $pot->exists() ){
|
||||
throw new Loco_error_Exception( __('Template file already exists','loco-translate') );
|
||||
}
|
||||
|
||||
// Bundle may deliberately lock template to avoid end-user tampering
|
||||
// it makes little sense to do so when template doesn't exist, but we will honour the setting anyway.
|
||||
if( $project->isPotLocked() ){
|
||||
throw new Loco_error_Exception('Template is protected from updates by the bundle configuration');
|
||||
}
|
||||
|
||||
// Just warn if POT writing will fail when saved, but still show screen
|
||||
$dir = $pot->getParent();
|
||||
|
||||
// Avoiding full source scan until actioned, but calculate size to manage expectations
|
||||
$bytes = 0;
|
||||
$nfiles = 0;
|
||||
$nskip = 0;
|
||||
$largest = 0;
|
||||
$sources = $project->findSourceFiles();
|
||||
// skip files larger than configured maximum
|
||||
$opts = Loco_data_Settings::get();
|
||||
$max = wp_convert_hr_to_bytes( $opts->max_php_size );
|
||||
/* @var $sourceFile Loco_fs_File */
|
||||
foreach( $sources as $sourceFile ){
|
||||
$nfiles++;
|
||||
$fsize = $sourceFile->size();
|
||||
$largest = max( $largest, $fsize );
|
||||
if( $fsize > $max ){
|
||||
$nskip += 1;
|
||||
// uncomment to log which files are too large to be scanned
|
||||
// Loco_error_AdminNotices::debug( sprintf('%s is %s',$sourceFile,Loco_mvc_FileParams::renderBytes($fsize)) );
|
||||
}
|
||||
else {
|
||||
$bytes += $fsize;
|
||||
}
|
||||
}
|
||||
$this->set( 'scan', new Loco_mvc_ViewParams( array (
|
||||
'bytes' => $bytes,
|
||||
'count' => $nfiles,
|
||||
'skip' => $nskip,
|
||||
'size' => Loco_mvc_FileParams::renderBytes($bytes),
|
||||
'large' => Loco_mvc_FileParams::renderBytes($max),
|
||||
'largest' => Loco_mvc_FileParams::renderBytes($largest),
|
||||
) ) );
|
||||
|
||||
// file metadata
|
||||
$this->set('pot', Loco_mvc_FileParams::create( $pot ) );
|
||||
$this->set('dir', Loco_mvc_FileParams::create( $dir ) );
|
||||
|
||||
$title = __('New template file','loco-translate');
|
||||
$subhead = sprintf( __('New translations template for "%s"','loco-translate'), $project );
|
||||
$this->set('subhead', $subhead );
|
||||
|
||||
// navigate up to bundle listing page
|
||||
$breadcrumb->add( $title );
|
||||
$this->set( 'breadcrumb', $breadcrumb );
|
||||
|
||||
// ajax service takes the target directory path
|
||||
$content_dir = loco_constant('WP_CONTENT_DIR');
|
||||
$target_path = $pot->getParent()->getRelativePath($content_dir);
|
||||
|
||||
// hidden fields to pass through to Ajax endpoint
|
||||
$this->set( 'hidden', new Loco_mvc_ViewParams( array(
|
||||
'action' => 'loco_json',
|
||||
'route' => 'xgettext',
|
||||
'loco-nonce' => $this->setNonce('xgettext')->value,
|
||||
'type' => $bundle->getType(),
|
||||
'bundle' => $bundle->getHandle(),
|
||||
'domain' => $project->getId(),
|
||||
'path' => $target_path,
|
||||
'name' => $pot->basename(),
|
||||
) ) );
|
||||
|
||||
// File system connect required if location not writable
|
||||
$relpath = $pot->getRelativePath($content_dir);
|
||||
$this->prepareFsConnect('create', $relpath );
|
||||
|
||||
$this->enqueueScript('potinit');
|
||||
return $this->view( 'admin/init/init-pot' );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
86
vendor/loco-translate/src/admin/list/BaseController.php
vendored
Normal file
86
vendor/loco-translate/src/admin/list/BaseController.php
vendored
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
/**
|
||||
* Common controller for listing of all bundle types
|
||||
*/
|
||||
abstract class Loco_admin_list_BaseController extends Loco_mvc_AdminController {
|
||||
|
||||
private $bundles = array();
|
||||
|
||||
|
||||
/**
|
||||
* build renderable bundle variables
|
||||
* @return Loco_mvc_ViewParams
|
||||
*/
|
||||
protected function bundleParam( Loco_package_Bundle $bundle ){
|
||||
$handle = $bundle->getHandle();
|
||||
// compatibility will be 'ok', 'warn' or 'error' depending on severity
|
||||
if( $default = $bundle->getDefaultProject() ){
|
||||
$compat = $default->getPot() instanceof Loco_fs_File;
|
||||
}
|
||||
else {
|
||||
$compat = false;
|
||||
}
|
||||
//$info = $bundle->getHeaderInfo();
|
||||
return new Loco_mvc_ViewParams( array (
|
||||
'id' => $bundle->getId(),
|
||||
'name' => $bundle->getName(),
|
||||
'dflt' => $default ? $default->getDomain() : '--',
|
||||
'size' => count( $bundle ),
|
||||
'save' => $bundle->isConfigured(),
|
||||
'type' => $type = strtolower( $bundle->getType() ),
|
||||
'view' => Loco_mvc_AdminRouter::generate( $type.'-view', array( 'bundle' => $handle ) ),
|
||||
'time' => $bundle->getLastUpdated(),
|
||||
) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add bundle to enabled or disabled list, depending on whether it is configured
|
||||
*/
|
||||
protected function addBundle( Loco_package_Bundle $bundle ){
|
||||
$this->bundles[] = $this->bundleParam($bundle);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-list-bundles'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
// breadcrumb is just the root
|
||||
$here = new Loco_admin_Navigation( array (
|
||||
new Loco_mvc_ViewParams( array( 'name' => $this->get('title') ) ),
|
||||
) );
|
||||
|
||||
/*/ tab between the types of bundles
|
||||
$types = array (
|
||||
'' => __('Home','loco-translate'),
|
||||
'theme' => __('Themes','loco-translate'),
|
||||
'plugin' => __('Plugins','loco-translate'),
|
||||
);
|
||||
$current = $this->get('_route');
|
||||
$tabs = new Loco_admin_Navigation;
|
||||
foreach( $types as $type => $name ){
|
||||
$href = Loco_mvc_AdminRouter::generate($type);
|
||||
$tabs->add( $name, $href, $type === $current );
|
||||
}
|
||||
*/
|
||||
|
||||
return $this->view( 'admin/list/bundles', array (
|
||||
'bundles' => $this->bundles,
|
||||
'breadcrumb' => $here,
|
||||
) );
|
||||
}
|
||||
|
||||
|
||||
}
|
16
vendor/loco-translate/src/admin/list/CoreController.php
vendored
Normal file
16
vendor/loco-translate/src/admin/list/CoreController.php
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Dummy controller skips "core" list view, rendering the core projects directly as a single bundle.
|
||||
* Route: loco-core -> loco-core-view
|
||||
*/
|
||||
class Loco_admin_list_CoreController extends Loco_admin_RedirectController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getLocation(){
|
||||
return Loco_mvc_AdminRouter::generate('core-view');
|
||||
}
|
||||
|
||||
}
|
109
vendor/loco-translate/src/admin/list/LocalesController.php
vendored
Normal file
109
vendor/loco-translate/src/admin/list/LocalesController.php
vendored
Normal file
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
/**
|
||||
* Lists all installed locales.
|
||||
* WordPress decides what is "installed" based on presence of core translation files
|
||||
*/
|
||||
class Loco_admin_list_LocalesController extends Loco_mvc_AdminController {
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function init(){
|
||||
parent::init();
|
||||
$this->enqueueStyle('locale');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getHelpTabs(){
|
||||
return array (
|
||||
__('Overview','default') => $this->viewSnippet('tab-list-locales'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
$this->set( 'title', __( 'Installed languages', 'loco-translate' ) );
|
||||
|
||||
$used = array();
|
||||
$locales = array();
|
||||
$api = new Loco_api_WordPressTranslations;
|
||||
|
||||
$active = get_locale();
|
||||
|
||||
// list which sites have each language as their WPLANG setting
|
||||
if( $multisite = is_multisite() ){
|
||||
$this->set('multisite',true);
|
||||
/* @var WP_Site $site */
|
||||
foreach( get_sites() as $site ){
|
||||
$id = (int) $site->blog_id;
|
||||
$tag = get_blog_option( $id, 'WPLANG') or $tag = 'en_US';
|
||||
$name = get_blog_option( $id, 'blogname' );
|
||||
$used[$tag][] = $name;
|
||||
}
|
||||
}
|
||||
// else single site shows tick instead of site name
|
||||
else {
|
||||
$used[$active][] = '✓';
|
||||
}
|
||||
|
||||
// add installed languages to file crawler
|
||||
$finder = new Loco_package_Locale;
|
||||
|
||||
// Pull "installed" languages (including en_US)
|
||||
foreach( $api->getInstalledCore() as $tag ){
|
||||
$locale = Loco_Locale::parse($tag);
|
||||
if( $locale->isValid() ){
|
||||
$tag = (string) $locale;
|
||||
$finder->addLocale($locale);
|
||||
$args = array( 'locale' => $tag );
|
||||
$locales[$tag] = new Loco_mvc_ViewParams( array(
|
||||
'nfiles' => 0,
|
||||
'time' => 0,
|
||||
'lcode' => $tag,
|
||||
'lname' => $locale->ensureName($api),
|
||||
'lattr' => 'class="'.$locale->getIcon().'" lang="'.$locale->lang.'"',
|
||||
'href' => Loco_mvc_AdminRouter::generate('lang-view',$args),
|
||||
'used' => isset($used[$tag]) ? implode( ', ', $used[$tag] ) : ( $multisite ? '--' : '' ),
|
||||
'active' => $active === $tag,
|
||||
) );
|
||||
}
|
||||
}
|
||||
$this->set('locales', $locales );
|
||||
|
||||
|
||||
// Count up unique PO files
|
||||
foreach( $finder->findLocaleFiles() as $file ){
|
||||
if( preg_match('/(?:^|-)([_a-zA-Z]+).po$/', $file->basename(), $r ) ){
|
||||
$locale = Loco_Locale::parse($r[1]);
|
||||
if( $locale->isValid() ){
|
||||
$tag = (string) $locale;
|
||||
$locales[$tag]['nfiles']++;
|
||||
$locales[$tag]['time'] = max( $locales[$tag]['time'], $file->modified() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// POT files are in en_US locale
|
||||
$tag = 'en_US';
|
||||
foreach( $finder->findTemplateFiles() as $file ){
|
||||
$locales[$tag]['nfiles']++;
|
||||
$locales[$tag]['time'] = max( $locales[$tag]['time'], $file->modified() );
|
||||
}
|
||||
|
||||
|
||||
return $this->view( 'admin/list/locales' );
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
31
vendor/loco-translate/src/admin/list/PluginsController.php
vendored
Normal file
31
vendor/loco-translate/src/admin/list/PluginsController.php
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
/**
|
||||
* List all bundles of type "plugin"
|
||||
* Route: loco-plugin
|
||||
*/
|
||||
class Loco_admin_list_PluginsController extends Loco_admin_list_BaseController {
|
||||
|
||||
|
||||
public function render(){
|
||||
|
||||
$this->set( 'type', 'plugin' );
|
||||
$this->set( 'title', __( 'Translate plugins', 'loco-translate' ) );
|
||||
|
||||
foreach( Loco_package_Plugin::get_plugins() as $handle => $data ){
|
||||
try {
|
||||
$bundle = Loco_package_Plugin::create( $handle );
|
||||
$this->addBundle($bundle);
|
||||
}
|
||||
// @codeCoverageIgnoreStart
|
||||
catch( Exception $e ){
|
||||
$bundle = new Loco_package_Plugin( $handle, $handle );
|
||||
$this->addBundle( $bundle );
|
||||
}
|
||||
// @codeCoverageIgnoreEnd
|
||||
}
|
||||
|
||||
return parent::render();
|
||||
}
|
||||
|
||||
|
||||
}
|
26
vendor/loco-translate/src/admin/list/ThemesController.php
vendored
Normal file
26
vendor/loco-translate/src/admin/list/ThemesController.php
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
/**
|
||||
* List all bundles of type "theme"
|
||||
* Route: loco-theme
|
||||
*/
|
||||
class Loco_admin_list_ThemesController extends Loco_admin_list_BaseController {
|
||||
|
||||
|
||||
|
||||
|
||||
public function render(){
|
||||
|
||||
$this->set('type', 'theme' );
|
||||
$this->set('title', __( 'Translate themes', 'loco-translate' ) );
|
||||
|
||||
/* @var $theme WP_Theme */
|
||||
foreach( wp_get_themes() as $theme ){
|
||||
$bundle = Loco_package_Theme::create( $theme->get_stylesheet() );
|
||||
$this->addBundle( $bundle );
|
||||
}
|
||||
|
||||
return parent::render();
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue