Laravel Localization does not return translated string - laravel

I can't seem to figure out what I'm doing wrong.
I want my application to use "np" as its default locale. So I change the locale key in config/app.php to 'np.' And when I check for the current location in my controller, it returns 'np', so it's working fine until here. Then I created a "np.json" file directly inside the lang directory, which has the following content:
{
"Candidate": "उम्मेदवार"
}
Now when I try to return the translated string using:
__('Candidate')
It returns "Candidate" instead of "उम्मेदवार", even if the current locale function still returns "np". So I ran the following commands trying to clear the cache.
php artisan optimize:clear
php artisan config:clear
php artisan cache:clear
But still, the issue persists.

You have to call the translations like <filename>.translation_string, and that file has be placed inside a folder with your language code.
In your case, create a folder inside lang called np, then place a translation file (example: mystrings.php) in it, so you have this file in a folder lang/np/mystrings.php.
Your trans file looks like
<?php
return [
'Candidate' => 'उम्मेदवार',
];
Now, you have to set the lang to your language np with app()->setLocale('np'); or you set it directly in your .env and now you can call
echo __('mystrings.Candidate');
to get your translation.
Hope it helps

Related

Laravel route() - not passing root folder name

Thank you in advance,
I have one route defined like
Route::get('/registration/verify/{token}', 'UserController#verifyRegisteredEmail')->name('registration.email.verification');
I am accessing the route like
route('registration.email.verification', ['token' => $email_register_verification_token]);
when I am printing above line it is giving them out as below
http://localhost/registration/verify/87006dcc95bcf7a9ea83e523f2aa53f9
But it should be
http://localhost/{root}/registration/verify/87006dcc95bcf7a9ea83e523f2aa53f9
Try setting the proper APP_URL in .env. It only outputs the wrong value from there.
Try to set the APP_URL inside .env file, and run this command php artisan config:cache
If you have some routes with a same prefix, You can use prefix option in routes groups like this:
Route::prefix('Your Root')->group(function(){
Route::get('/registration/verify/{token}', 'UserController#verifyRegisteredEmail')->name('registration.email.verification');
});

artisan make:migration ignores subfolders? [duplicate]

This question already has answers here:
Laravel running migrations on "app/database/migrations" folder recursively
(15 answers)
Closed 2 years ago.
I am using Laravel 5.6 and and migration files inside database/migrations/ work when I call artisan migrate but migration files in subfolders like database/migrations/example are skipped.
Even artisan migrate:status does not show the subfolders.
How can I tell Laravel to also include migration files from subfolders?
vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php line 465
same line number since Laravel 5.7 I guess, there's this line:
return Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php');
This looks for the root migrations path matching the *_*.php pattern. If it was **/*_*.php you would've accomplished what you wanted.
But, good news! It can be hacked! The method responsible for getting the paths:
vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\BaseCommand.php line 19
says that the path argument you gave to the command, will not be sanitized, or modified,
if ($this->input->hasOption('path') && $this->option('path')) {
return collect($this->option('path'))->map(function ($path) {
return ! $this->usingRealPath()
? $this->laravel->basePath().'/'.$path
: $path;
})->all();
}
So, setting the path argument as database/migrations/** should enable you to recurse into subfolders.
php artisan migrate --path="database/migrations/**"
Note: Then, for every migrate[:*] command to work, you need to specify the --path attribute. I migrated and rolled back with the --path attribute, and it worked.
There's a method in ServiceProvider that can do that for you.
loadMigrationsFrom($paths)
You will need to call it in your AppServiceProvider in the boot method like so:
public function boot()
{
$paths = [your, custom, migration, directories];
$this->loadMigrationsFrom($paths);
}
After doing this, running php artisan migtate will take subdirectories in consideration.

How to make Laravel read .env file again?

I'm changing Laravel .env variable after a process, and checking that variable everytime, if it's true code doing one thing, if it's false another thing. But after changing the .env variable I have to restart with php artisan serve, I don't want to do this. Why Laravel does not read the new env variable, it changes on the .env file itself.
You shouldn't have to manipulate environment variables during runtime. If you're trying to manipulate an environment variable, you should probably instead utilize a config value. These configuration files are placed in the config/ directory of your project.
Then during runtime, you can use the following built-in config helper to get/set your config variable.
$value = config('app.timezone');
// To set configuration values at runtime, pass an array to the config helper
config(['app.timezone' => 'America/Chicago']);
$newValue = config('app.timezone');
You can read more about this process here (you can change the version to your version):
https://laravel.com/docs/5.5/configuration#accessing-configuration-values

How to read a .docx file via PHP Word sample code in Codeigniter

Am trying to read a .docx file which is inside my project folder via PHP Word library. I have included autoloader like this :
include_once 'vendor/autoload.php'; in my controller.
CODE FOR FUNCTION IN CONTROLLER:
function test_phpword()
{
$a=base_url();
$path=$a."".'123.docx';
$source =$path;
echo date('H:i:s'), " Reading contents from `{$source}`";
$phpWord = \PhpOffice\PhpWord\IOFactory::load($source);
echo write($phpWord, basename(__FILE__, '.php'), $writers);
}
BUT GETTING ERROR LIKE BELOW:
06:18:42 Reading contents from http://localhost/myproject/123.docx
Fatal error: Uncaught Exception: Cannot find archive file. in /opt/lampp/htdocs/myproject/vendor/phpoffice/common/src/Common/XMLReader.php:51
Try this
Change
$path=$a."".'123.docx';
to
$path='123.docx';
And put 123.docx beside your php script file. make sure the two files are in the same place. Run your php script again.
If this helps and works fine you can check the file path and make proper change to your php program.
While loading the path, you have to give relative path to the doc file as shown below,
$random_name = 123.docx;
$contents = \PhpOffice\PhpWord\IOFactory::load('../uploads/'.$random_name);
I don't know whats your $base_url, but it will not work if it is absolute path like http://path/to/doc/file.
I have worked on it and tested. Hope it helps.

Laravel 5 doesn't read values from dot ENV files

I don't know if this question is relevant or not. LARAVEL 5 is still in developmental phase. I have pulled LARAVEL 5 after watching one of the Laracast video about new features in LARAVEL 5. I couldn't resist to wait for its formal release.
I named the local environment dot file as .env.local.php. But for some reason I am unable to get the the values from this dot file when using $_ENV['KEY'].
I am quite sure that I have configured the environment correctly. When doing $app->environment() shows the correct environment. Has it been changed in LARAVEL 5 the way we get the values from dot files or am I missing something ?
By default in environment.php file you have something like that:
if (file_exists(__DIR__.'/../.env'))
{
Dotenv::load(__DIR__.'/../');
}
so only .env file is being read (notice .env not .env.php - so you should rename your file - or you can add as 2nd parameter file name .env.php if you want). Any other environment files (.local.env) are not being read by default - you will need to load them manually.
If you don't have such code by default, you should probably update/install Laravel 5 again (changes appear very often)
Now, I don't know what method you use, but you can put in your .env file also your environment name in for example APP_ENV variable, create .local.env file with content you want and then you could use in environment.php file:
if (file_exists(__DIR__.'/../.env'))
{
Dotenv::load(__DIR__.'/../');
if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
echo "loading";
Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
}
}
If you don't want to do it this way, you can probably change the other and load env file you want based on $env assuming you use PC based environment detection.
If it's unclear you can also look at What's the correct way to set ENV variables in Laravel 5?

Resources