Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v3.0 #230

Draft
wants to merge 23 commits into
base: master
Choose a base branch
from
Draft

v3.0 #230

Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Driver refactoring started
Florian Stascheck committed Jul 22, 2022
commit 57a5adecd4a3fda4232bc102a33505731bd6b595
3 changes: 3 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -7,6 +7,9 @@ parameters:
- database
- src
level: 8
ignoreErrors:
- '#Access to an undefined property JoeDixon\\Translation\\(Language|Translation)::\$#'
- "#Property '([^']+)' does not exist in JoeDixon\\\\Translation\\\\(Language|Translation) model.#"
checkModelProperties: true
checkOctaneCompatibility: true
checkMissingIterableValueType: false
27 changes: 17 additions & 10 deletions src/Console/Commands/SynchroniseTranslations.php
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Collection;
use JoeDixon\Translation\Drivers\CombinedTranslations;
use JoeDixon\Translation\Drivers\Database\Database;
use JoeDixon\Translation\Drivers\File\File;
use JoeDixon\Translation\Drivers\Translation;
@@ -125,7 +126,7 @@ private function createDriver(string $driver): Translation

/**
* @param Translation $driver
* @param Collection<string,Collection> $languages
* @param Collection<string,CombinedTranslations> $languages
* @return void
*/
private function mergeLanguages(Translation $driver, Collection $languages): void
@@ -135,19 +136,19 @@ private function mergeLanguages(Translation $driver, Collection $languages): voi
}
}

private function mergeTranslations(Translation $driver, string $language, CombinedTranslations $translations): void
{
$this->mergeGroupTranslations($driver, $language, $translations->shortKeyTranslations);
$this->mergeSingleTranslations($driver, $language, $translations->stringKeyTranslations);
}

/**
* @param Translation $driver
* @param string $language
* @param Collection<string,array> $translations
* @param Collection<string,Collection<string,string|array>> $groups
* @return void
*/
private function mergeTranslations(Translation $driver, string $language, Collection $translations): void
{
$this->mergeGroupTranslations($driver, $language, $translations['group']);
$this->mergeSingleTranslations($driver, $language, $translations['single']);
}

private function mergeGroupTranslations(Translation $driver, string $language, array $groups): void
private function mergeGroupTranslations(Translation $driver, string $language, Collection $groups): void
{
foreach ($groups as $group => $translations) {
foreach ($translations as $key => $value) {
@@ -159,7 +160,13 @@ private function mergeGroupTranslations(Translation $driver, string $language, a
}
}

private function mergeSingleTranslations(Translation $driver, string $language, array $vendors): void
/**
* @param Translation $driver
* @param string $language
* @param Collection<string,Collection<string,string|array>> $vendors
* @return void
*/
private function mergeSingleTranslations(Translation $driver, string $language, Collection $vendors): void
{
foreach ($vendors as $vendor => $translations) {
foreach ($translations as $key => $value) {
1 change: 0 additions & 1 deletion src/Database/Factories/TranslationFactory.php
Original file line number Diff line number Diff line change
@@ -39,7 +39,6 @@ public function stringKey(): static
return $this->state(function () {
return [
'group' => 'string',

];
});
}
37 changes: 37 additions & 0 deletions src/Drivers/CombinedTranslations.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace JoeDixon\Translation\Drivers;

use Closure;
use Illuminate\Support\Collection;

class CombinedTranslations
{

/**
* @param Collection<string,Collection<string,array|string>> $stringKeyTranslations
* @param Collection<string,Collection<string,array|string>> $shortKeyTranslations
* @return void
*/
public function __construct(
public Collection $stringKeyTranslations,
public Collection $shortKeyTranslations,
) {
}

public function toArray(): array
{
return [
'string' => $this->stringKeyTranslations,
'short' => $this->shortKeyTranslations,
];
}

public function map(Closure $callback): self
{
$this->stringKeyTranslations = $this->stringKeyTranslations->map($callback);
$this->shortKeyTranslations = $this->shortKeyTranslations->map($callback);

return $this;
}
}
38 changes: 14 additions & 24 deletions src/Drivers/Database/Database.php
Original file line number Diff line number Diff line change
@@ -2,18 +2,20 @@

namespace JoeDixon\Translation\Drivers\Database;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use JoeDixon\Translation\Drivers\Translation;
use JoeDixon\Translation\Exceptions\LanguageExistsException;
use JoeDixon\Translation\Language;
use JoeDixon\Translation\Scanner;

class Database extends Translation
{
use InteractsWithStringKeys, InteractsWithShortKeys;

public function __construct(protected $sourceLanguage, protected $scanner)
{
public function __construct(
protected string $sourceLanguage,
protected Scanner $scanner,
) {
}

/**
@@ -31,7 +33,7 @@ public function allLanguages(): Collection
*/
public function languageExists(string $language): bool
{
return $this->getLanguage($language) ? true : false;
return Language::where('language', $language)->count() > 0;
}

/**
@@ -50,31 +52,19 @@ public function addLanguage(string $language, ?string $name = null): void
}

/**
* Get all translations.
* Get a language from the database.
*/
public function allTranslations(): Collection
private function getLanguage(string $language): Language
{
return $this->allLanguages()->mapWithKeys(function ($name, $language) {
return [$language => $this->allTranslationsFor($language)];
});
return Language::where('language', $language)->firstOrFail();
}

/**
* Get all translations for a given language.
*/
public function allTranslationsFor(string $language): Collection
private function getOrCreateLanguage(string $language): Language
{
return Collection::make([
'short' => $this->allShortKeyTranslationsFor($language),
'string' => $this->allStringKeyTranslationsFor($language),
]);
}
if (! $this->languageExists($language)) {
$this->addLanguage($language);
}

/**
* Get a language from the database.
*/
private function getLanguage(string $language): ?Model
{
return Language::where('language', $language)->first();
return $this->getLanguage($language);
}
}
5 changes: 2 additions & 3 deletions src/Drivers/Database/InteractsWithShortKeys.php
Original file line number Diff line number Diff line change
@@ -42,14 +42,13 @@ public function allShortKeyGroupsFor(string $language): Collection
/**
* Add a short key translation.
*/
public function addShortKeyTranslation($language, $group, $key, $value = ''): void
public function addShortKeyTranslation(string $language, string $group, string $key, string $value = ''): void
{
if (! $this->languageExists($language)) {
$this->addLanguage($language);
}

Language::where('language', $language)
->first()
$this->getLanguage($language)
->translations()
->updateOrCreate([
'group' => $group,
10 changes: 2 additions & 8 deletions src/Drivers/Database/InteractsWithStringKeys.php
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@
namespace JoeDixon\Translation\Drivers\Database;

use Illuminate\Support\Collection;
use JoeDixon\Translation\Language;
use JoeDixon\Translation\Translation;

trait InteractsWithStringKeys
@@ -39,14 +38,9 @@ public function allStringKeyTranslationsFor(string $language): Collection
/**
* Add a single translation.
*/
public function addStringKeyTranslation($language, $vendor, $key, $value = ''): void
public function addStringKeyTranslation(string $language, string $vendor, string $key, string $value = ''): void
{
if (! $this->languageExists($language)) {
$this->addLanguage($language);
}

Language::where('language', $language)
->first()
$this->getOrCreateLanguage($language)
->translations()
->updateOrCreate([
'group' => $vendor,
31 changes: 6 additions & 25 deletions src/Drivers/File/File.php
Original file line number Diff line number Diff line change
@@ -4,18 +4,20 @@

use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Collection;
use JoeDixon\Translation\Drivers\CombinedTranslations;
use JoeDixon\Translation\Drivers\Translation;
use JoeDixon\Translation\Exceptions\LanguageExistsException;
use JoeDixon\Translation\Scanner;

class File extends Translation
{
use InteractsWithStringKeys, InteractsWithShortKeys;

public function __construct(
private Filesystem $disk,
private $languageFilesPath,
protected $sourceLanguage,
protected $scanner
private string $languageFilesPath,
protected string $sourceLanguage,
protected Scanner $scanner
) {
}

@@ -57,28 +59,7 @@ public function addLanguage(string $language, ?string $name = null): void

$this->disk->makeDirectory("{$this->languageFilesPath}".DIRECTORY_SEPARATOR."$language");
if (! $this->disk->exists("{$this->languageFilesPath}".DIRECTORY_SEPARATOR."{$language}.json")) {
$this->saveStringKeyTranslations($language, collect(['string' => collect()]));
$this->saveStringKeyTranslations($language, collect(['string' => new Collection()]));
}
}

/**
* Get all translations.
*/
public function allTranslations(): Collection
{
return $this->allLanguages()->mapWithKeys(function ($language) {
return [$language => $this->allTranslationsFor($language)];
});
}

/**
* Get all translations for a given language.
*/
public function allTranslationsFor($language): Collection
{
return Collection::make([
'short' => $this->allShortKeyTranslationsFor($language),
'string' => $this->allStringKeyTranslationsFor($language),
]);
}
}
8 changes: 4 additions & 4 deletions src/Drivers/File/InteractsWithShortKeys.php
Original file line number Diff line number Diff line change
@@ -55,12 +55,12 @@ public function addShortKeyTranslation(string $language, string $group, string $

// does the group exist? If not, create it.
if (! $translations->keys()->contains($group)) {
$translations->put($group, collect());
$translations->put($group, new Collection());
}

$values = $translations->get($group);
$values[$key] = $value;
$translations->put($group, collect($values));
$translations->put($group, new Collection($values));

$this->saveShortKeyTranslations($language, $group, new Collection($translations->get($group)));
}
@@ -89,10 +89,10 @@ protected function allShortKeyFilesFor(string $language): Collection
/**
* Get all the vendor short key files for a given language.
*/
protected function allVendorShortKeyFilesFor(string $language): ?Collection
protected function allVendorShortKeyFilesFor(string $language): Collection
{
if (! $this->disk->exists("{$this->languageFilesPath}".DIRECTORY_SEPARATOR.'vendor')) {
return null;
return new Collection();
}

$vendorGroups = [];
15 changes: 10 additions & 5 deletions src/Drivers/File/InteractsWithStringKeys.php
Original file line number Diff line number Diff line change
@@ -14,9 +14,9 @@ public function allStringKeyTranslationsFor(string $language): Collection
{
$files = new Collection($this->disk->allFiles($this->languageFilesPath));

return $files->filter(function ($file) use ($language) {
return strpos($file, "{$language}.json");
})->flatMap(function ($file) {
return $files->filter(
fn ($file) => str_ends_with($file, "{$language}.json")
)->flatMap(function ($file) {
if (strpos($file->getPathname(), 'vendor')) {
$vendor = Str::before(Str::after($file->getPathname(), 'vendor'.DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR);

@@ -37,7 +37,7 @@ public function addStringKeyTranslation(string $language, string $vendor, string
}

$translations = $this->allStringKeyTranslationsFor($language);
$translations->get($vendor) ?: $translations->put($vendor, collect());
$translations->get($vendor) ?: $translations->put($vendor, new Collection());
$translations->get($vendor)->put($key, $value);

$this->saveStringKeyTranslations($language, $translations);
@@ -51,9 +51,14 @@ private function saveStringKeyTranslations(string $language, Collection $transla
foreach ($translations as $group => $translation) {
$vendor = Str::before($group, '::string');
$languageFilePath = $vendor !== 'string' ? 'vendor'.DIRECTORY_SEPARATOR."{$vendor}".DIRECTORY_SEPARATOR."{$language}.json" : "{$language}.json";
$json = json_encode((object) $translations->get($group), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
if ($json === false) {
continue;
}

$this->disk->put(
"{$this->languageFilesPath}".DIRECTORY_SEPARATOR."{$languageFilePath}",
json_encode((object) $translations->get($group), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
$json
);
}
}
25 changes: 20 additions & 5 deletions src/Drivers/Translation.php
Original file line number Diff line number Diff line change
@@ -7,9 +7,13 @@
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use JoeDixon\Translation\Events\TranslationAdded;
use JoeDixon\Translation\Scanner;

abstract class Translation
{
protected Scanner $scanner;
protected string $sourceLanguage;

/**
* Get all languages.
*/
@@ -28,12 +32,23 @@ abstract public function addLanguage(string $language, ?string $name = null): vo
/**
* Get all translations.
*/
abstract public function allTranslations(): Collection;
public function allTranslations(): Collection
{
return $this->allLanguages()->mapWithKeys(fn ($name, $language) =>
[$language => $this->allTranslationsFor($language)]
);
}

/**
* Get all translations for a given language.
*/
abstract public function allTranslationsFor(string $language): Collection;
public function allTranslationsFor(string $language): CombinedTranslations
{
return new CombinedTranslations(
$this->allStringKeyTranslationsFor($language),
$this->allShortKeyTranslationsFor($language),
);
}

/**
* Get short key translations for a given language.
@@ -74,7 +89,7 @@ public function findMissingTranslations(string $language): array
/**
* Save all of the translations in the app without translation for a given language.
*/
public function saveMissingTranslations(?string $language = null)
public function saveMissingTranslations(?string $language = null): void
{
$languages = $language ? [$language => $language] : $this->allLanguages();

@@ -98,7 +113,7 @@ public function saveMissingTranslations(?string $language = null)
/**
* Get all translations for a given language merged with the source language.
*/
public function getSourceLanguageTranslationsWith(string $language): Collection
public function getSourceLanguageTranslationsWith(string $language): CombinedTranslations
{
$sourceTranslations = $this->allTranslationsFor($this->sourceLanguage);
$languageTranslations = $this->allTranslationsFor($language);
@@ -139,7 +154,7 @@ public function filterTranslationsFor(string $language, ?string $filter): Collec
});
}

public function add(Request $request, $language, $isGroupTranslation)
public function add(Request $request, string $language, bool $isGroupTranslation): void
{
$namespace = $request->has('namespace') && $request->get('namespace') ? "{$request->get('namespace')}::" : '';
$group = $namespace.$request->get('group');
22 changes: 6 additions & 16 deletions src/Events/TranslationAdded.php
Original file line number Diff line number Diff line change
@@ -8,21 +8,11 @@ class TranslationAdded
{
use Dispatchable;

public $key;
public $group;
public $value;
public $language;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(string $language, string $group, string $key, string $value)
{
$this->language = $language;
$this->group = $group;
$this->key = $key;
$this->value = $value;
public function __construct(
public string $language,
public string $group,
public string $key,
public string $value,
) {
}
}