mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-11-13 01:54:30 +00:00
integrated Phing as build framework, moved translation export for SPA from artisan
This commit is contained in:
parent
04da6074e8
commit
0f7be5a43a
9 changed files with 185 additions and 132 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,6 +5,7 @@
|
||||||
/.composer
|
/.composer
|
||||||
/.env
|
/.env
|
||||||
/.env.dottie-backup
|
/.env.dottie-backup
|
||||||
|
/.vscode
|
||||||
#/.git
|
#/.git
|
||||||
/.git-credentials
|
/.git-credentials
|
||||||
/.gitconfig
|
/.gitconfig
|
||||||
|
|
21
build.xml
21
build.xml
|
@ -7,18 +7,27 @@
|
||||||
<!-- added folders to include lookups -->
|
<!-- added folders to include lookups -->
|
||||||
<includepath classpath = "vendor/phing/phing/classes" />
|
<includepath classpath = "vendor/phing/phing/classes" />
|
||||||
<includepath classpath = "build/lib" />
|
<includepath classpath = "build/lib" />
|
||||||
<includepath classpath = "build/phing/tasks" />
|
<includepath classpath = "build/phing" />
|
||||||
|
|
||||||
<!-- CUSTOM TASKS -->
|
<!-- CUSTOM TASKS -->
|
||||||
<taskdef classname="pixelfed.i18n.generate" name="i18nGenerate" />
|
<taskdef classname="tasks.pixelfed.i18n.GenerateTask" name="generatei18n" />
|
||||||
|
|
||||||
|
|
||||||
<!-- TARGETS -->
|
<!-- TARGETS -->
|
||||||
<target name = "build" description = "assemble/generate codebase">
|
<target name = "build_translations" description = "generate/verify translations">
|
||||||
<i18nGenerate />
|
<generatei18n />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name = "install" depends = "build" description = "install all requirements on the system">
|
<target name = "build_web" description = "generate/pack web assets">
|
||||||
|
<exec executable = "npm" checkreturn = "true" logoutput = "true">
|
||||||
|
<arg value = "run" />
|
||||||
|
<arg value = "development" />
|
||||||
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name = "build" description = "assemble/generate codebase">
|
||||||
|
<phingcall target = "build_translations" />
|
||||||
|
<phingcall target = "build_web" />
|
||||||
|
</target>
|
||||||
|
|
||||||
</project>
|
</project>
|
31
build/lib/BuildTaskBase.php
Normal file
31
build/lib/BuildTaskBase.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace lib;
|
||||||
|
|
||||||
|
require_once 'phing/Task.php';
|
||||||
|
|
||||||
|
use Illuminate\Contracts\Console\Kernel;
|
||||||
|
use Illuminate\Foundation\Application;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for all Pixelfed custom build tasks
|
||||||
|
*/
|
||||||
|
abstract class BuildTaskBase extends \Task {
|
||||||
|
/**
|
||||||
|
* Laravel application instance
|
||||||
|
*/
|
||||||
|
protected $app;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->bootstrapLaravelApplication();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Couples the Laravel application lifetime with the task lifetime,
|
||||||
|
* ensuring build tasks can use the same paradigm as artisan commands
|
||||||
|
*/
|
||||||
|
private function bootstrapLaravelApplication() {
|
||||||
|
$this->app = require Application::inferBasePath() . '/bootstrap/app.php';
|
||||||
|
$this->app->make(Kernel::class)->bootstrap();
|
||||||
|
}
|
||||||
|
}
|
43
build/lib/Directories.php
Normal file
43
build/lib/Directories.php
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton that stores important directories
|
||||||
|
* task-wide.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DIRECTORIES {
|
||||||
|
private static $instance;
|
||||||
|
|
||||||
|
/// Root folder for translationn source files
|
||||||
|
public string $TranslationsRoot;
|
||||||
|
|
||||||
|
/// Export folder for single page web application
|
||||||
|
public string $TranslationsExportSpa;
|
||||||
|
/// Export folder for single page web application (alternate path)
|
||||||
|
public string $TranslationsExportSpaAlt;
|
||||||
|
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->TranslationsRoot = resource_path('lang/');
|
||||||
|
$this->TranslationsExportSpa = resource_path('assets/js/i18n/');
|
||||||
|
$this->TranslationsExportSpaAlt = public_path('_lang/');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function __clone() { }
|
||||||
|
public function __wakeup()
|
||||||
|
{ throw new \Exception("Cannot unserialize a singleton."); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the unique instance of the singleton.
|
||||||
|
*
|
||||||
|
* Only available after completion of BuildTaskBase constructor
|
||||||
|
* due to dependency on Laravel application initilization.
|
||||||
|
*/
|
||||||
|
public static function get(): DIRECTORIES {
|
||||||
|
if(!isset(self::$instance)) {
|
||||||
|
self::$instance = new DIRECTORIES();
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,108 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Translation-related tooling.
|
|
||||||
*
|
|
||||||
* Translation is in flux at this time, as it is split between two
|
|
||||||
* realms; server-side HTML delivered via Laravel and a single page
|
|
||||||
* app powered by Vue.js.
|
|
||||||
*
|
|
||||||
* Both frameworks have translation systems (Illumate\Translation for
|
|
||||||
* Laravel and an i18n plugin for Vue.js) with spiritually similar
|
|
||||||
* systems, using native data structures (arrays for PHP and hashes
|
|
||||||
* for Vue.js).
|
|
||||||
*
|
|
||||||
* The translation support solution that encapsulate both, currently,
|
|
||||||
* is to start from the php files and push to the SPA, in order to
|
|
||||||
* allow for full translation.
|
|
||||||
*
|
|
||||||
* SPA translations are contained in the web.php data file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace pixelfed\i18n;
|
|
||||||
|
|
||||||
use Illuminate\Console\Command;
|
|
||||||
|
|
||||||
define('RESOURCES_PATH', 'resources/lang');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Operates on a set of translation values.
|
|
||||||
*/
|
|
||||||
class TranslationSet {
|
|
||||||
private string $lang_code;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a translation set from a language code
|
|
||||||
*
|
|
||||||
* @return TranslationSet Translations for requested language
|
|
||||||
*/
|
|
||||||
public static function FromLanguageCode(string $code) {
|
|
||||||
return new \TranslationSet($code);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function ExportToJson() {
|
|
||||||
$strings = \Lang::get('web', [], $this->lang_code);
|
|
||||||
$json = json_encode($strings, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
||||||
$path = "{DIRECTORIES::get().export}{$this->lang_code}.json";
|
|
||||||
file_put_contents($path, $json);
|
|
||||||
$pathAlt = "{DIRECTORIES::get().exportAlt}{$this->lang_code}.json";
|
|
||||||
file_put_contents($pathAlt, $json);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function __construct(string $code) {
|
|
||||||
$this->lang_code = $code;
|
|
||||||
$this->rootPath = base_path('resources/lang') . '/' . $code;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class LanguageCodes {
|
|
||||||
/**
|
|
||||||
* By scanning the translation resources folder, builds
|
|
||||||
* a list of all currently defined translation languages.
|
|
||||||
*
|
|
||||||
* @return array[] Language codes for all defined translations
|
|
||||||
*/
|
|
||||||
public static function GetAllDefined() {
|
|
||||||
foreach (new \DirectoryIterator($path) as $io) {
|
|
||||||
$name = $io->getFilename();
|
|
||||||
$skip = ['vendor'];
|
|
||||||
if($io->isDot() || in_array($name, $skip)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($io->isDir()) {
|
|
||||||
array_push($langs, $name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This singleton class efficiently stores and
|
|
||||||
* tracks directories used in various operations
|
|
||||||
* of i18n.
|
|
||||||
*/
|
|
||||||
class DIRECTORIES {
|
|
||||||
private static $instance;
|
|
||||||
|
|
||||||
// enforce singleton pattern
|
|
||||||
protected function __construct() {
|
|
||||||
$this->export = resource_path('assets/js/i18n/');
|
|
||||||
$this->exportAlt = public_path('_lang/');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function __clone() { }
|
|
||||||
public function __wakeup()
|
|
||||||
{ throw new \Exception("Cannot unserialize a singleton."); }
|
|
||||||
|
|
||||||
public static function get(): DIRECTORIES {
|
|
||||||
if(!isset(self::$instance)) {
|
|
||||||
self::$instance = new DIRECTORIES();
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public $export;
|
|
||||||
public $exportAlt;
|
|
||||||
}
|
|
31
build/lib/i18n/LanguageCode.php
Normal file
31
build/lib/i18n/LanguageCode.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace lib\i18n;
|
||||||
|
|
||||||
|
require_once 'Directories.php';
|
||||||
|
|
||||||
|
class LanguageCodes {
|
||||||
|
/**
|
||||||
|
* By scanning the translation resources folder, builds
|
||||||
|
* a list of all currently defined translation languages.
|
||||||
|
*
|
||||||
|
* @return array[] Language codes for all defined translations
|
||||||
|
*/
|
||||||
|
public static function GetAllDefined() {
|
||||||
|
$langs = array();
|
||||||
|
|
||||||
|
foreach (new \DirectoryIterator(\DIRECTORIES::get()->TranslationsRoot) as $io) {
|
||||||
|
$name = $io->getFilename();
|
||||||
|
$skip = ['vendor'];
|
||||||
|
if($io->isDot() || in_array($name, $skip)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($io->isDir()) {
|
||||||
|
array_push($langs, $name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $langs;
|
||||||
|
}
|
||||||
|
};
|
40
build/lib/i18n/TranslationSet.php
Normal file
40
build/lib/i18n/TranslationSet.php
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace lib\i18n;
|
||||||
|
|
||||||
|
require_once 'Directories.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracks a set of translations for a given language
|
||||||
|
* code.
|
||||||
|
*/
|
||||||
|
class TranslationSet {
|
||||||
|
/**
|
||||||
|
* Obtain a translation set for a language code
|
||||||
|
*
|
||||||
|
* @return TranslationSet Translations for requested language
|
||||||
|
*/
|
||||||
|
public static function FromLanguageCode(string $code) {
|
||||||
|
return new TranslationSet($code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export subset of translations for the single page web
|
||||||
|
* application for Pixelfed.
|
||||||
|
*
|
||||||
|
* Translations are taken from the web PHP source file and
|
||||||
|
* pushed out as a Vue.js i18n JSON file.
|
||||||
|
*/
|
||||||
|
public function ExportForSinglePageApp() {
|
||||||
|
$dirs = \DIRECTORIES::get();
|
||||||
|
$strings = \Lang::get('web', [], $this->lang_code);
|
||||||
|
$json = json_encode($strings, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||||
|
$path = "{$dirs->TranslationsExportSpa}{$this->lang_code}.json";
|
||||||
|
file_put_contents($path, $json);
|
||||||
|
|
||||||
|
$pathAlt = "{$dirs->TranslationsExportSpaAlt}{$this->lang_code}.json";
|
||||||
|
file_put_contents($pathAlt, $json);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function __construct(private string $lang_code) {}
|
||||||
|
};
|
24
build/phing/tasks/pixelfed/i18n/GenerateTask.php
Normal file
24
build/phing/tasks/pixelfed/i18n/GenerateTask.php
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require 'BuildTaskBase.php';
|
||||||
|
|
||||||
|
require 'i18n/LanguageCode.php';
|
||||||
|
require 'i18n/TranslationSet.php';
|
||||||
|
|
||||||
|
|
||||||
|
use lib\BuildTaskBase;
|
||||||
|
use lib\i18n\LanguageCodes;
|
||||||
|
use lib\i18n\TranslationSet;
|
||||||
|
|
||||||
|
|
||||||
|
class GenerateTask extends BuildTaskBase {
|
||||||
|
public function __construct() { parent::__construct(); }
|
||||||
|
|
||||||
|
public function init() {}
|
||||||
|
|
||||||
|
public function main() {
|
||||||
|
foreach(LanguageCodes::GetAllDefined() as $lang) {
|
||||||
|
TranslationSet::FromLanguageCode($lang)->ExportForSinglePageApp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,18 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace pixelfed\i18n;
|
|
||||||
|
|
||||||
require_once 'phing/Task.php';
|
|
||||||
require_once 'i18n.php';
|
|
||||||
|
|
||||||
use Task;
|
|
||||||
|
|
||||||
class generate extends Task {
|
|
||||||
public function __construct() {}
|
|
||||||
|
|
||||||
public function main() {
|
|
||||||
foreach(LanguageCodes::GetAllDefined() as $lang) {
|
|
||||||
TranslationSet.FromLanguageCode($lang).ExportToJson();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
Loading…
Reference in a new issue