diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..332f52d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +/.gitattributes export-ignore +/.gitignore export-ignore +phpunit.xml.dist export-ignore +/tests export-ignore diff --git a/.gitignore b/.gitignore index 7376990..a932082 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /vendor composer.lock -.idea/ +phpunit.xml .phpunit.result.cache diff --git a/LICENSE.md b/LICENSE.md index 7700d01..707250a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,7 @@ # The MIT License (MIT) Copyright (c) 2015 Mohamed Said +Copyright (c) 2020 Guido Cella > Permission is hereby granted, free of charge, to any person obtaining a copy > of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 32c5b26..fffaae6 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,30 @@ -# Laravel 5 Multilingual Models +# Laravel Multilingual Models -[![Latest Version on Packagist](https://img.shields.io/packagist/v/themsaid/laravel-multilingual.svg?style=flat-square)](https://packagist.org/packages/themsaid/laravel-multilingual) -[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) -[![Total Downloads](https://img.shields.io/packagist/dt/themsaid/laravel-multilingual.svg?style=flat-square)](https://packagist.org/packages/themsaid/laravel-multilingual) +Make Eloquent model attributes translatable without separate database tables for translation values. +Simply access `$country->name` and you get a value based on your application's current locale. -This laravel package makes Eloquent Models attributes translatable without the need to separate database tables for translation values. +`$country->nameTranslations->en` will be the value of a specific locale. -You simply call `$country->name` and you get a value based on your application's current locale. - -You can also call `$country->nameTranslations->en` to get the value of a specific locale. - -You can check all the translations of a given attributes as easy as `$country->nameTranslations->toArray()`. +You can get all the translations of a given attributes with `$country->nameTranslations->toArray()`. ## Installation -Begin by installing the package through Composer. Run the following command in your terminal: +Install the package through Composer: -``` -composer require themsaid/laravel-multilingual -``` - -Once composer is done, add the package service provider in the providers array in `config/app.php` - -``` -Themsaid\Multilingual\MultilingualServiceProvider::class +```sh +composer require guidocella/laravel-multilingual ``` -Finally publish the config file: +Then publish the config file: -``` +```sh php artisan vendor:publish ``` -That's all, you are now good to go. - # Usage -First you need to make sure that the translatable attributes has a mysql field type of text or json, if you are building the database from a migration file you may do this: +First make sure that the translatable attributes' field type is `text` or `json`. If you are building the database from a migration file you may do this: ```php 'array']; } ``` -- Add the `Translatable` trait to your model class -- Add a public class property `$translatable` as an array that holds the names of the translatable fields in your model. -- Remember to cast the translatable attribute as 'array' in the `$casts` property of the model. +The trait will override the `getCasts` method to instruct Eloquent to cast all `$translatable` attributes to `array` without having to specify them again in `$casts`. -Now our model has the `name` attribute translatable, so on creating a new Model you may specify the name field as follow: +Now that our model's `name` attribute is translatable, when creating a new model you may specify the name field as follows: ```php [ - 'en' => "Spain", - 'sp' => 'España' + 'en' => 'Spain', + 'es' => 'España' ] ]); ``` -It'll be automatically converted to a JSON string and saved in the name field of the database, you can later retrieve the name like this: +It will be automatically converted to a JSON string and saved in the name field of the database. You can later retrieve the name like this: -``` +```php $country->name ``` -This will return the country name based on the current locale, if the current locale doesn't have a value then the `fallback_locale` defined in the config file will be used. +This will return the country name based on the current locale. If the translation in the current locale doesn't have a non-null value then the `fallback_locale` defined in the config file will be used. -In case nothing can be found an empty string will be returned. +In case nothing can be found `null` will be returned. -You may also want to return the value for a specific locale, you can do that using the following syntax: +You may also want to return the value for a specific locale; you can do it using the following syntax: -``` +```php $country->nameTranslations->en ``` @@ -101,54 +84,54 @@ This will return the English name of the country. To return an array of all the available translations you may use: -``` +```php $country->nameTranslations->toArray() ``` +You can update the translation in a single locale with Eloquent's arrow syntax for JSON fields: + +```php +$country->update(['name->'.App::getLocale() => 'Spain']); +``` + # Validation -You can use the new array validation features released with laravel 5.2 to validate the presence of specific locales: + +You can validate the presence of specific locales like so: ```php ['en'=>'One', 'sp'=>'Uno']], +$validator = validator( + ['name' => ['en' => 'One', 'es' => 'Uno']], ['name.en' => 'required'] ); ``` -However a validation rule is included in this package that deals with requiring all the validations to be provided: +However, this package includes the `translatable_required` validation rule for requiring that the translations are provided in every locale: ```php ['en'=>'One', 'sp'=>'Uno']], +$validator = validator( + ['name' => ['en' => 'One', 'es' => 'Uno']], ['name' => 'translatable_required'] ); ``` -The `translatable_required` rule will make sure all the values of the available locales are set. +You may define the available locales as well as the `fallback_locale` from the package config file. -You may define the available locales as well as the fallback_locale from the package config file. +Now you only need to add the translated message of our new validation rule: add this to the `validation.php` translation file: -Now you only need to add the translated message of our new validation rule, add this to the `validation.php` translation file: - -``` +```php 'translatable_required' => 'The :attribute translations must be provided.', ``` # Queries -If you're using MySQL 5.7 or above, it's recommended that you use the json data type for housing translations in the Database, -this will allow you to query these columns like this: - -```php -Company::whereRaw('name->"$.en" = \'Monsters Inc.\'')->orderByRaw('specs->"$.founded_at"')->get(); -``` -However in laravel 5.2.23 and above you can use the fluent syntax: +Laravel lets you query JSON columns with the `->` operator: ```php -Company::where('name->en', 'Monsters Inc.')->orderBy('specs->founded_at')->get(); +Company::where('name->en', 'Monsters Inc.')->first(); +Country::orderBy('name->'.App::getLocale())->get(); ``` diff --git a/composer.json b/composer.json index 28b4afe..e400a61 100644 --- a/composer.json +++ b/composer.json @@ -1,35 +1,31 @@ { - "name": "themsaid/laravel-multilingual", - "description": "Easy multilingual laravel models", + "name": "guidocella/laravel-multilingual", + "description": "Easy multilingual Laravel models", "keywords": ["laravel", "multilingual", "translation"], - "homepage": "https://github.com/themsaid/laravel-multilingual", + "homepage": "https://github.com/guidocella/laravel-multilingual", "license": "MIT", - "authors": [ - { - "name": "Mohamed Said", - "email": "theMohamedSaid@gmail.com" - } - ], "require": { - "illuminate/support": "^5.1||^6.0", - "php" : ">=5.3.0" + "illuminate/database": "^8", + "php" : ">=7.4" }, "require-dev": { - "phpunit/phpunit" : "^8.0", - "orchestra/testbench": "^4.0" + "laravel/laravel": "^8", + "phpunit/phpunit" : "^9" }, "autoload": { "psr-4": { - "Themsaid\\Multilingual\\": "src" - }, - "classmap": [ - "tests" - ] + "GuidoCella\\Multilingual\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "GuidoCella\\Multilingual\\": "tests" + } }, "extra": { "laravel": { "providers": [ - "Themsaid\\Multilingual\\MultilingualServiceProvider" + "GuidoCella\\Multilingual\\ServiceProvider" ] } } diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index 30dc3e0..0000000 --- a/phpunit.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - ./tests/ - - - diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..f444ff4 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,8 @@ + + + + + tests + + + diff --git a/src/MultilingualServiceProvider.php b/src/MultilingualServiceProvider.php deleted file mode 100644 index 9fe9b01..0000000 --- a/src/MultilingualServiceProvider.php +++ /dev/null @@ -1,56 +0,0 @@ -publishes([ - __DIR__.'/config/multilingual.php' => config_path('multilingual.php'), - ]); - - - $this->app['validator']->extendImplicit('translatable_required', function ($attribute, $value, $parameters) use ($systemLocales) { - if (! is_array($value)) { - return false; - } - - // Get only the locales that has a value and exists in the system locales array - $locales = array_filter(array_keys($value), function ($locale) use ($value, $systemLocales) { - return @$value[$locale] && in_array($locale, $systemLocales); - }); - - foreach ($systemLocales as $systemLocale) { - if (! in_array($systemLocale, $locales)) { - return false; - } - } - - return true; - }); - } - - /** - * Register any package services. - * - * @return void - */ - public function register() - { - $this->mergeConfigFrom( - __DIR__.'/config/multilingual.php', 'multilingual' - ); - } -} \ No newline at end of file diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php new file mode 100644 index 0000000..6b1f857 --- /dev/null +++ b/src/ServiceProvider.php @@ -0,0 +1,24 @@ +publishes([__DIR__.'/config/multilingual.php' => config_path('multilingual.php')]); + + $this->app['validator']->extendImplicit('translatable_required', function ($attribute, $value, $parameters) { + if (!is_array($value)) { + return false; + } + + return collect(config('multilingual.locales'))->every(fn ($locale) => !empty($value[$locale])); + }); + } + + public function register(): void + { + $this->mergeConfigFrom(__DIR__.'/config/multilingual.php', 'multilingual'); + } +} diff --git a/src/Translatable.php b/src/Translatable.php index fb6a3cd..4190e3e 100644 --- a/src/Translatable.php +++ b/src/Translatable.php @@ -1,85 +1,44 @@ translatable)) { - // We check if the attribute is translatable and return a proper - // value based on the current locale - if (in_array($key, $this->translatable)) { - return $this->getValueOfCurrentLocaleForKey($key); - }; + if (in_array($key, $this->translatable ?? [])) { + return $this->getValueOfCurrentLocaleForKey($key); + } - // We check if the attribute is expected to return the - // TranslationManager's object - $translatableKey = str_replace('Translations', '', $key); - if (in_array($translatableKey, $this->translatable)) { - return new TranslationsManager( - $this->getAttributeValue($translatableKey) - ); - } + $translatableKey = str_replace('Translations', '', $key); + if (in_array($translatableKey, $this->translatable ?? [])) { + return new TranslationsManager( + $this->getAttributeValue($translatableKey) + ); } return parent::getAttribute($key); } - /** - * Get the value of current locale for $key attribute, if not found it falls - * back to the fallback locale or the first locale in array. - * - * @param $key - * @return string - */ - public function getValueOfCurrentLocaleForKey($key) + public function getValueOfCurrentLocaleForKey(string $key): ?string { $translations = $this->getAttributeValue($key); - $currentLocale = config('app.locale'); - $fallbackLocale = config('multilingual.fallback_locale'); - if ( ! $translations) return ""; - - if ( ! @$translations[$currentLocale]) { - return @$translations[$fallbackLocale] ?: ''; - }; - - return @$translations[$currentLocale]; + return $translations[config('app.locale')] ?? + $translations[config('multilingual.fallback_locale')] ?? null; } - /** - * Alter the default Illuminate\Database\Eloquent\Model method for checking if attribute - * should be casted as JSON, we check if the attribute is translatable & cast - * it as JSON even if it's not casted as JSON in Model::$casts - * - * @param string $key - * @return bool - */ - protected function isJsonCastable($key) + public function getCasts(): array { - if (isset($this->translatable) && in_array($key, $this->translatable)) { - return true; - } - - return parent::isJsonCastable($key); + return array_merge( + array_fill_keys($this->translatable ?? [], 'array'), + parent::getCasts() + ); } /** - * Alter the default behaviour when it comes to using json_encode for model attributes, - * this will save the json as UTF-8 to the database instead of escaping characters. - * - * @param array $value - * @return string + * Alter the default behaviour when it comes to using json_encode for model attributes; + * this will save the JSON as UTF-8 to the database instead of escaping characters. */ protected function asJson($value) { diff --git a/src/TranslationsManager.php b/src/TranslationsManager.php index e25b0e5..a1fa399 100644 --- a/src/TranslationsManager.php +++ b/src/TranslationsManager.php @@ -1,35 +1,23 @@ translations = $translations; } - /** - * @param $key - * @return mixed - */ - public function __get($key) + public function __get(string $key): ?string { - return @$this->translations[$key] ?: ''; + return $this->translations[$key] ?? null; } - /** - * Return an array of available locales with values - * - * @return array - */ - public function toArray() + public function toArray(): array { return $this->translations; } -} \ No newline at end of file +} diff --git a/src/config/multilingual.php b/src/config/multilingual.php index 0730336..8357aab 100644 --- a/src/config/multilingual.php +++ b/src/config/multilingual.php @@ -1,10 +1,6 @@ ['en'], + 'locales' => ['en'], 'fallback_locale' => 'en', - - ]; diff --git a/tests/Models/Planet.php b/tests/Models/Planet.php new file mode 100644 index 0000000..d8273f1 --- /dev/null +++ b/tests/Models/Planet.php @@ -0,0 +1,15 @@ +make(Kernel::class)->bootstrap(); + + return $app; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->app['config']->set([ + 'database.default' => 'sqlite', + 'database.connections.sqlite.database' => ':memory:', + 'multilingual.locales' => ['en', 'es'], + 'multilingual.fallback_locale' => 'en', + ]); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php deleted file mode 100644 index 5bd2c3a..0000000 --- a/tests/TestCase.php +++ /dev/null @@ -1,91 +0,0 @@ -prepareDatabase(); - } - - public function test_database_setup() - { - $this->assertTrue(Schema::hasTable('planets')); - } - - /** - * Define environment setup. - * - * @param \Illuminate\Foundation\Application $app - * @return void - */ - protected function getEnvironmentSetUp($app) - { - $app['config']->set('multilingual.locales', ['en', 'sp']); - $app['config']->set('multilingual.fallback_locale', 'en'); - - $app['config']->set('database.default', 'mysql'); - $app['config']->set('database.connections.mysql', [ - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => $this->DBName, - 'username' => $this->DBUsername, - 'password' => $this->DBPassword, - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', - 'strict' => false, - ]); - } - - /** - * Loading package service provider - * - * @param \Illuminate\Foundation\Application $app - * @return array - */ - protected function getPackageProviders($app) - { - return ['Themsaid\Multilingual\MultilingualServiceProvider']; - } - - /** - * Get package aliases. - * - * @param \Illuminate\Foundation\Application $app - * - * @return array - */ - protected function getPackageAliases($app) - { - return [ - 'Schema' => 'Illuminate\Database\Schema\Blueprint' - ]; - } - - public function prepareDatabase() - { - if ( ! Schema::hasTable('planets')) { - Schema::create('planets', function (Blueprint $table) { - $table->increments('id'); - $table->string('name'); - $table->string('order'); - }); - } - } -} diff --git a/tests/TranslationsTest.php b/tests/TranslationsTest.php index 2bb7046..801af5a 100644 --- a/tests/TranslationsTest.php +++ b/tests/TranslationsTest.php @@ -1,179 +1,98 @@ 'Mercury' - ]); +use GuidoCella\Multilingual\Models\Planet; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; - $this->assertEquals('Mercury', $planet->name); - } - - public function test_translatable_attribute_casted_as_NOT_ARRAY_is_saved_as_json_still() +class TranslationsTest extends MultilingualTestCase +{ + protected function setUp(): void { - $planet = Planet::create([ - 'order' => [ - 'en' => 'One', - 'sp' => 'Uno' - ] - ]); + parent::setUp(); - $this->assertJson($planet->getOriginal('order')); + Schema::create('planets', fn (Blueprint $table) => $table->string('name')->nullable()); } - public function test_translatable_attribute_return_value_of_current_locale() + public function testTranslatableAttributeIsValueOfCurrentLocale() { - $planet = Planet::create([ + config(['app.locale' => 'es']); + $this->assertSame('Mercurio', Planet::create([ 'name' => [ 'en' => 'Mercury', - 'sp' => 'Mercurio' - ] - ]); - - config(['app.locale' => 'sp']); - - $this->assertEquals('Mercurio', $planet->name); + 'es' => 'Mercurio', + ], + ])->name); } - public function test_translatable_attribute_return_empty_string_if_no_translations() + public function testTranslatableAttributeIsNullIfTranslationsAreMissing() { - $planet = Planet::create(); - - config(['app.locale' => 'en']); - - $this->assertEquals('', $planet->name); + $this->assertNull(Planet::create()->name); } - public function test_translatable_attribute_return_default_value_if_current_locale_not_exist() + public function testTranslatableAttributeIsFallbackValueIfCurrentLocaleValueIsMissing() { - $planet = Planet::create([ + config(['multilingual.fallback_locale' => 'es']); + config(['app.locale' => 'ar']); + $this->assertSame('Mercurio', Planet::create([ 'name' => [ 'en' => 'Mercury', - 'sp' => 'Mercurio' - ] - ]); - - config(['multilingual.fallback_locale' => 'sp']); - config(['app.locale' => 'ar']); - - $this->assertEquals('Mercurio', $planet->name); + 'es' => 'Mercurio', + ], + ])->name); } - public function test_translatable_attribute_return_fallback_value_if_current_locale_empty() + public function testTranslatableAttributeIsFallbackValueIfCurrentLocaleValueIsNull() { - $planet = Planet::create([ - 'name' => [ - 'en' => '', - 'sp' => 'Mercurio' - ] - ]); - - config(['multilingual.fallback_locale' => 'sp']); + config(['multilingual.fallback_locale' => 'es']); config(['app.locale' => 'en']); - - $this->assertEquals('Mercurio', $planet->name); - } - - public function test_translatable_attribute_return_empty_value_if_current_and_fallback_locale_empty() - { - $planet = Planet::create([ + $this->assertSame('Mercurio', Planet::create([ 'name' => [ - 'en' => '', - 'sp' => '', - 'fr' => 'No Idea' - ] - ]); - - config(['multilingual.fallback_locale' => 'sp']); - config(['app.locale' => 'en']); - - $this->assertEquals('', $planet->name); + 'en' => null, + 'es' => 'Mercurio', + ], + ])->name); } - public function test_returning_array_of_all_translations() + public function testTranslatableAttributeIsNullIfCurrentAndFallbackLocaleValuesAreNull() { - $planetName = [ - 'en' => 'Mercury', - 'sp' => 'Mercurio' - ]; - - $planet = Planet::create([ - 'name' => $planetName - ]); - + config(['multilingual.fallback_locale' => 'es']); config(['app.locale' => 'en']); - - $this->assertEquals($planetName, $planet->nameTranslations->toArray()); + $this->assertNull(Planet::create([ + 'name' => [ + 'en' => null, + 'es' => null, + 'it' => 'Mercurio', + ], + ])->name); } - public function test_returning_the_value_of_specific_locale() + public function testArrayOfAllTranslations() { - $planetName = [ - 'en' => 'Mercury', - 'sp' => 'Mercurio' - ]; - - $planet = Planet::create([ - 'name' => $planetName - ]); - config(['app.locale' => 'en']); - - $this->assertEquals('Mercurio', $planet->nameTranslations->sp); - } - - public function test_returning_empty_string_if_NO_value_of_specific_locale() - { - $planetName = [ + $planetNames = [ 'en' => 'Mercury', - 'sp' => '' + 'es' => 'Mercurio', ]; - - $planet = Planet::create([ - 'name' => $planetName - ]); - - config(['app.locale' => 'en']); - - $this->assertEquals('', $planet->nameTranslations->sp); + $this->assertSame($planetNames, Planet::create(['name' => $planetNames])->nameTranslations->toArray()); } - public function test_returning_empty_string_if_value_not_array() + public function testValueOfSpecificLocale() { - $planetId = Planet::insertGetId([ - 'name' => 'Earth' - ]); - - $planet = Planet::find($planetId); - config(['app.locale' => 'en']); - - $this->assertEquals('', $planet->name); + $this->assertSame('Mercurio', Planet::create(['name' => [ + 'en' => 'Mercury', + 'es' => 'Mercurio', + ]])->nameTranslations->es); } - public function test_returning_empty_string_for_a_specific_locale_if_value_not_array() + public function testValueOfSpecificLocaleIsNullIfTranslationIsMissing() { - $planetId = Planet::insertGetId([ - 'name' => 'Earth' - ]); - - $planet = Planet::find($planetId); - config(['app.locale' => 'en']); - - $this->assertEquals('', $planet->nameTranslations->sp); + $this->assertNull(Planet::create(['name' => [ + 'en' => 'Mercury', + 'es' => 'Mercurio', + ]])->nameTranslations->it); } - } diff --git a/tests/ValidationTest.php b/tests/ValidationTest.php index 2e518d4..88755f0 100644 --- a/tests/ValidationTest.php +++ b/tests/ValidationTest.php @@ -1,91 +1,45 @@ ''], - ['name' => 'translatable_required'] - ); - - $this->assertTrue($validator->messages()->has('name')); - } - - public function test_validation_fails_if_required_but_empty_array() - { - $validator = Validator::make( - ['name' => []], - ['name' => 'translatable_required'] - ); + parent::setUp(); - $this->assertTrue($validator->messages()->has('name')); + (new ServiceProvider(app()))->boot(); } - public function test_validation_fails_if_required_but_string() + public function testFailsWithoutArray() { - $validator = Validator::make( + $this->assertTrue(validator( ['name' => 'This is not cool'], ['name' => 'translatable_required'] - ); - - $this->assertTrue($validator->messages()->has('name')); + )->messages()->has('name')); } - public function test_validation_fails_if_required_and_has_correct_keys_but_empty_values() + public function testFailsWithMissingTranslations() { - $validator = Validator::make( - ['name' => ['en' => '']], - ['name' => 'translatable_required'] - ); - - $this->assertTrue($validator->messages()->has('name')); - } - - public function test_validation_fails_if_required_and_has_missing_translations() - { - $validator = Validator::make( + $this->assertTrue(validator( ['name' => ['en' => 'One']], ['name' => 'translatable_required'] - ); - - $this->assertTrue($validator->messages()->has('name')); + )->messages()->has('name')); } - public function test_validation_fails_if_required_and_has_empty_translations() + public function testFailsWithEmptyTranslations() { - $validator = Validator::make( - ['name' => ['en' => 'One', 'sp' => '']], + $this->assertTrue(validator( + ['name' => ['en' => 'One', 'es' => '']], ['name' => 'translatable_required'] - ); - - $this->assertTrue($validator->messages()->has('name')); + )->messages()->has('name')); } - public function test_validation_succeed_if_required_and_OK() + public function testPassesWithAllTranslations() { - $validator = Validator::make( - ['name' => ['en' => 'One', 'sp' => 'Uno']], + $this->assertTrue(validator( + ['name' => ['en' => 'One', 'es' => 'Uno', 'it' => 'Uno']], ['name' => 'translatable_required'] - ); - - $this->assertFalse($validator->messages()->has('name')); - } - - public function test_only_specific_locales_required() - { - $validator = Validator::make( - ['name' => ['en' => 'One', 'sp' => 'Uno']], - ['name.en' => 'required'] - ); - $this->assertTrue($validator->passes()); - - $validator = Validator::make( - ['name' => ['sp' => 'Uno']], - ['name.en' => 'required'] - ); - $this->assertFalse($validator->passes()); + )->passes()); } } diff --git a/tests/models/MULTILINGUAL_TEST_PLANET_MODEL.php b/tests/models/MULTILINGUAL_TEST_PLANET_MODEL.php deleted file mode 100644 index 204c781..0000000 --- a/tests/models/MULTILINGUAL_TEST_PLANET_MODEL.php +++ /dev/null @@ -1,21 +0,0 @@ - 'integer', - 'name' => 'array', - 'order' => 'integer', - ]; - -} \ No newline at end of file diff --git a/tests/models/MULTILINGUAL_TEST__UNTRANSLATABLE_PLANET_MODEL.php b/tests/models/MULTILINGUAL_TEST__UNTRANSLATABLE_PLANET_MODEL.php deleted file mode 100644 index e880d19..0000000 --- a/tests/models/MULTILINGUAL_TEST__UNTRANSLATABLE_PLANET_MODEL.php +++ /dev/null @@ -1,19 +0,0 @@ - 'integer', - 'name' => 'array', - ]; - -} \ No newline at end of file