Reroute with extra parameter for multi language sites in Codeigniter - php

In my codeigniter webapp, I'm using multi language site. Default and in english like these:
www.xxx.com (default)
www.xxx.com/en (english)
And I have a controller where I want to re-route specific calls say potato and tomato to vegie like these:
www.xxx.com/potato/param => www.xxx.com/vegie/param
www.xxx.com/tomato/param => www.xxx.com/vegie/param
So far, I have managed to reroute with default language url using like this in my route.php:
$route['potato/(.+)$'] = 'vegie/$1';
$route['tomato/(.+)$'] = 'vegie/$1';
But I doesn't work for the english site. I did like this, and not working:
$route['en/potato/(.+)$'] = 'en/vegie/$1';
$route['en/tomato/(.+)$'] = 'en/vegie/$1';
Anyone can help me for this? Thanks.

First, create new function to manage the english version, ex: function vegie_en()
then route to it
$route['en/potato/(:any)'] = 'vegie_en/$1';

I have found the problem. I have this in my route.php which makes it rerouting wrongly if there's prefix en/:
$route['en/(.+)$'] = '$1';
I moved this to the end of the route.php and it working very fine now.

I had faced same problem in my project. I fixed it by removing the 'en' and put $2 as for dynamic value.
So in your case, this will work.Please try this given below code.
$route['en/potato/(.+)$'] = 'vegie/$2';
$route['en/tomato/(.+)$'] = 'vegie/$2';

Related

How to make dynamic router management in CI 3

In my website I need to customise the url ,
I done it some way ,everything is working fine .I got what I need ,but I want to do it in a proper way .
Below is my code
$route['admin/lessons'] = 'admin/admin/lessons';
$route['admin/lesson_mgmt'] = 'admin/admin/lesson_mgmt';
$route['admin/labs'] = 'admin/admin/labs';
$route['admin/tools'] = 'admin/admin/tools';
Here in this way I am managing the custom url section .
I want to make this url dynamic so that ,the code will not be longer ,there are other section .
If i will do it in this way ,I have to write a lot .
Here i want to replace everything in a single line.
Can anyone suggest me anything ?
Thank you in advance.
Try like this...
In your application/config/routes.php
$route['admin/([a-zA-Z0-9_-]+)'] = 'admin/admin/$1';
Hope it will work fine..
In above code.. [a-zA-Z0-9_-]+) this is regular expression having combination of one or more alphanumeric characters(alphabets+numbers).If route gets admin/characters...it redirect to admin/admin/characters.

Use hyphen(-) instead of slash(/) or underscore( _ ) in Routes

I'm Using Codeigniter 3.x , Using routes.php I want to create dynamic routes, for example I have a class name Class1.
I want output url
mysite.com/Class1-Student-Search
But using hyphen(-) is not working
If I put a slash(/), it works,
$route['(:any)/Student-Search'] = "search";
it returns
mysite.com/Class1/Student-Search
and using underscore (_) also work.
$route['(:any)_Student-Search'] = "search";
returns
mysite.com/Class1_Student-Search
But I want to use hyphen(-), if I put it, it will go to 404 error page, I used these four solutions but not work for me.
$route['(:any)-Student-Search'] = "search";
$route['([a-zA-Z]+)-Student-Search'] = "search";
$route['([a-zA-Z-0-9]+)-Student-Search'] = "search";
$route['(.*)-Student-Search'] = "search";
And if i hardcode the value in route
$route['Class1-Student-Search'] = "search";
Then it also working
You trying to create a dynamic routes which is not possible in codeigniter if you see the following flow chart of codeigniter you understand what i mean.
also you can see this chart in codeigniter official website
when you try to redirect or call some url it's work like this
Every request first goes to route there for you can't make it dynamic
Here is my solution, it is working for me, do like this.
$route['(:any)-Student-Search'] = "search";
then in your link button, hopefully in your view, href the link like this.
href="/<?php echo $row->classname; ?>-Student-Search"
the point is that not only you have to make your routes, also suffix it in your href link also the same way.

Codeigniter i18n issue with the default controller and the non-default language

First of all I want to thank you all for reading and apologize if the question has already been answered and I couldn't find it and for my bad english. That said, the issue:
I'm having trouble with an application I'm working on. I'm pretty new in codeigniter and the i18n internationalization. I want to know why the following is happening and how can I manage to fix it (I'm not just asking for 'teh codez'):
Codeigniter has this behavior when I enter some url:
if i enter: it redirects to:
site.com site.com/default_language/default_controller
site.com/default_language site.com/default_language (and loads the default controller)
site.com/language site.com/language (and loads the default controller)
Want I want to do is to change that behaviour to:
if i enter: it redirects to:
site.com site.com/default_language/default_controller
site.com/any_language site.com/any_language/default_controller
My languages in MY_Lang.php are:
$languages = array(
'es' => 'spanish',
'en' => 'english'
);
And my routes.php:
$route['default_controller'] = "cover";
$route['^(es|en)/(.+)$'] = "$2";
$route['^(es|en)$'] = $route['default_controller'];
Please let me know if you need another piece of code.
Thanks and greetings from Argentina!

how to hide controller name using routes when you have an id segment?

I have an url like this:
http://kees.een-site-bouwen.nl/home/categorie/11
to show factories in a specific category.
I want to have an url like this:
http://kees.een-site-bouwen.nl/categorie/11
but when i use the url routing in my config/routes file like this:
$route['categorie'] = 'home/categorie';
it does not work. am i missing something?
The working link to the page is:
echo '' .$value->Categorie. '';
The link that does not work is:
echo '' .$value->Categorie. '';
Hope someone can help me :)
$route['categorie/(:num)'] = 'home/categorie/$1';
Here is one easy, fast and clean route :)
Please read Documantation before asking.. CI Routing
You are missing to to mention the argument i.e 11 to like this
$route['categorie/(:num)']

Zend translate URL and language switcher

I have managed to make my URL i18n compliant using Zend_Controller_Router.
Ie:
en/user/login becomes fr/utilisateur/connexion and both URLs go to the same controller/action.
The problem I am facing is the following
I have a language switcher that is displayed as follow :
Français
English
Italiano
etc.
The currently active language doesn't have an anchor tag, but all others do.
For the languages that have an anchor on them I am building the URL and I want them to be translated in their specific languages.
Currently if I am in French all the urls get builded in french, even if I set the #local key as a param in the URL view helper (tried "#locale" => 'en', "#locale" => new Zend_Locale('en'))
en/utilisateur/connexion
it/utilisateur/connexion
instead of
en/user/login
it/utente/collegamento
because the locale used while building the URL is the one that is defined application wide.
EDIT
I digged a bit deeper in my issue an I found that only the current locale add its resources loaded, which mean I can't get route in the proper language for the route to be built in the right language
My new issue is : how do I load multiple language translation resources?
(I am planning to implement cache in the far future (near release), so I might get better performances)
Hope this helps re the new issue.
"My new issue is : how do I load multiple language translation resources?"
Just a quick caveat to say I didn't write the code below, it was taken from a example app put together by the guys at Zend however it might help to have it broken down like this.
Their approach for the example app was using a csv file containing translations and using your config file (the default one in a new project being application.ini) to specify the path to all your language translation resources.
like this:
;; Languages
language.file.en = APPLICATION_PATH "/../language/en/translate.csv"
language.file.fr = APPLICATION_PATH "/../language/fr/translate.csv"
language.file.de = APPLICATION_PATH "/../language/de/translate.csv"
language.file.es = APPLICATION_PATH "/../language/es/translate.csv"
language.name.zz = Language
language.name.en = English
language.name.fr = Français
language.name.de = Deutsche
language.name.es = Español
And in each csv file, if you are using something like Excel or Open Office to create it, column A would be the original language and column B the translation.
As an example where English is the original language and a Spanish translation is required:
A B
login entrar
logout salir
You could do that for all the words/phrases you want to translate.
If a translation isn't found then the default original word is used.
Your main application bootstrap could have something like this:
protected function _initLanguage()
{
$options = $this->getOptions();
Zend_Registry::set('language',$options['language']);
$langSess = new Zend_Session_Namespace('language');
if (!isset($langSess->translate)) {
$translate = new Zend_Translate('csv', $options['language']['file']['en']);
$langSess->translate = $translate;
}
if (!isset($langSess->locale)) {
$langSess->locale = 'en';
}
Zend_Locale::setDefault($langSess->locale);
}
As the translate object is held in the session you can use it in any of your views etc using something like:
$langSess = new Zend_Session_Namespace('language');
$translate = $langSess->translate;
and:
<?php echo $translate->_('login') ?>
where you want something to be translated on selecting an alternative language. In the example above the word login would appear when English is selected and entrar when Spanish is selected.
There's loads more to Zend_Translate than this and several ways to implement it so I'm not saying this is the best way by any means.
If it helps or if I can give you more info let me know.
Cheers,
Dave

Categories