Define application language / let users choose language

Wish to see a specific feature/change in future releases? Feel free to post it here, and if it gets enough "likes", we'd definitely include it in future releases!
Post Reply
onoehring
Veteran Member
Posts: 241
Joined: 2019-05-21 22:42
Contact:

Define application language / let users choose language

Post by onoehring » 2019-06-11 07:39

Hi,

it should be quite easy, to set the application default language.
Also, the user could be allowed to choose from a installed language.

Sounds so easy, and would make generating apps (in a non-english-language) easiert (no manual upload again and again) and would make appgini produce multi-language applications by the click of a button

Maybe like:
create folder \language
place language files in subfolder, use those instead.

Olaf

User avatar
jsetzer
AppGini Super Hero
AppGini Super Hero
Posts: 218
Joined: 2018-07-06 06:03
Location: Kiel, Germany
Contact:

Re: Define application language / let users choose language

Post by jsetzer » 2019-06-11 12:08

Hi Olaf,

I've already tried that. There is one big problem: at the moment in which language is being loaded, the session has not started, yet, and the user has not been authenticated. So there is no way to detect the user's language and load the desired language file.

Before I have downloaded and put multiple language files into a separate languages folder and renamed them to language.de.php for example.

I've been talking to BigProf about this. But there is no solution, yet.

Best,
Jan

pböttcher
AppGini Super Hero
AppGini Super Hero
Posts: 519
Joined: 2018-04-01 10:12

Re: Define application language / let users choose language

Post by pböttcher » 2019-06-11 15:33

Hi,

you can try this:

create a directory languages in the root of your app.

Copy the languages you want to provide to the user into that directory.

eg.

german.php
spanish.php
italian.php
...

now in the hooks folder you create a file language.php and insert

Code: Select all

<?php
$mi = getMemberInfo();
$lang=$mi['custom'][0];
if (isset($lang) && $lang !== '') {
	$language = $lang.".php";
	include("languages/".$language);
}
next you have to put in each of the files hooks/TABLENAME.php the line

include("hooks/language.php");

and also put in the file header.php at the top the lines

Code: Select all

<?php
// include("hooks/language.php");
?>
Now you can set the language for the user through the custom1 field in the membership_users record for the user.

So you could create a page that allows the user to select his prefered language (e.g. german or spanish or italian or ... ) and once selected store it in that field.

You can also create a complete different table and store per user the language information and retrieve it, as you wish.

onoehring
Veteran Member
Posts: 241
Joined: 2019-05-21 22:42
Contact:

Re: Define application language / let users choose language

Post by onoehring » 2019-06-12 09:08

Hi,

thanks to you both for your suggestions, which actually go even further than I originally had in mind.

The idea of pbötcher is nice, as it allows defining a specific language for the user.

To accomplish what Jan suggested, I propose a solution which I have used ... more than 10 years ago. Today there might be more elaborate codes, but this works quite nice and could be used to also show the login page automatically in a user preferred language.

Side note: Writing this, the question comes in mind, why not simply place a drop down with all available languages at the login page. When the user selects a language, the (language) form is submitted and the login page reloaded with the new language applied.

So here my code
php_language_detection.zip
(3.09 KiB) Downloaded 7 times
As you see near the end of function get_languages, in this code the user is being redirected to some page. This can be changed easily to set a language string variable, either in PHP and/or in the session.

Example: A user from Germany (usually DE in browser - check for yourself: https://www.whatismybrowser.com/detect/ ... er-sending ) would receive the German language (if installed) - if not installed he would get the default: English.
Someone from Italy (proably IT) would receive Italian automatically. If no accept-language is sent: Default - English.

In addition There might be also the option (as described above to use a dropdown). This seems useful, as people might be using some predefined system with a accept-language which they (the actual person) does not prefer.

Am I not seeing some general implementation problem?

Code: Select all

<?php
/*
Script Name: Full User Agent language detection
Author: Harald Hope, Website: http://techpatterns.com/
Script Source URI: http://techpatterns.com/downloads/php_language_detection.php
Version 0.3.2
Copyright (C) 09 March 2005

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

Lesser GPL license text:
http://www.gnu.org/licenses/lgpl.txt

Coding conventions:
http://cvs.sourceforge.net/viewcvs.py/phpbb/phpBB2/docs/codingstandards.htm?rev=1.3
*/
/****************************************** 
this will return an array composed of a 4 item array for each language the os supports
1. full language abbreviation, like en-ca
2. primary language, like en
3. full language string, like English (Canada)
4. primary language string, like English
*******************************************/

// will have choice of redirection header or just getting language data
function get_languages( $feature, $spare )
{
	// get the languages
	$a_languages = languages();
	$index = '';
	$complete = '';
	$found = false;// set to default value
	//prepare user language array
	$user_languages = array();

	//check to see if language is set
	if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) 
	{
		//explode languages into array
		$languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
		$languages = explode( ",", $languages );
		//$languages = explode( ",", $test);// this is for testing purposes only
		foreach ( $languages as $language_list )
		{
			// pull out the language, place languages into array of full and primary
			// string structure: 
			$temp_array = array(); 
			// slice out the part before ; on first step, the part before - on second, place into array
			$temp_array[0] = substr( $language_list, 0, strcspn( $language_list, ';' ) );//full language
			$temp_array[1] = substr( $language_list, 0, 2 );// cut out primary language
			//place this array into main $user_languages language array
			$user_languages[] = $temp_array;
		}

		//start going through each one
		for ( $i = 0; $i < count( $user_languages ); $i++ )
		{
			foreach ( $a_languages as $index => $complete ) 
			{
				if ( $index == $user_languages[$i][0] )
				{
					// complete language, like english (canada) 
					$user_languages[$i][2] = $complete;
					// extract working language, like english
					$user_languages[$i][3] = substr( $complete, 0, strcspn( $complete, ' (' ) );
				}
			}
		}
	}
	else// if no languages found
	{
		$user_languages[0] = array( '','','','' ); //return blank array.
	}
	// return parameters
	if ( $feature == 'data' )
	{
		return $user_languages;
	}
	elseif ( $feature == 'header' )
	{
		switch ( $user_languages[0][1] )// get default primary language, the first one in array that is
		{
			case 'de':
				$location = '/de/index.php';
				$found = true;
				break;
			default:
				break;
		}
		if ( $found )
		{
			header("Location: $location"); 
		}
		else// make sure you have a default page to send them to
		{
			header("Location: /en/index.php");
		}
	}
}

function languages()
{
// pack abbreviation/language array
// important note: you must have the default language as the last item in each major language, after all the
// en-ca type entries, so en would be last in that case
	$a_languages = array(
	'af' => 'Afrikaans',
	'sq' => 'Albanian',
	'ar-dz' => 'Arabic (Algeria)',
	'ar-bh' => 'Arabic (Bahrain)',
	'ar-eg' => 'Arabic (Egypt)',
	'ar-iq' => 'Arabic (Iraq)',
	'ar-jo' => 'Arabic (Jordan)',
	'ar-kw' => 'Arabic (Kuwait)',
	'ar-lb' => 'Arabic (Lebanon)',
	'ar-ly' => 'Arabic (libya)',
	'ar-ma' => 'Arabic (Morocco)',
	'ar-om' => 'Arabic (Oman)',
	'ar-qa' => 'Arabic (Qatar)',
	'ar-sa' => 'Arabic (Saudi Arabia)',
	'ar-sy' => 'Arabic (Syria)',
	'ar-tn' => 'Arabic (Tunisia)',
	'ar-ae' => 'Arabic (U.A.E.)',
	'ar-ye' => 'Arabic (Yemen)',
	'ar' => 'Arabic',
	'hy' => 'Armenian',
	'as' => 'Assamese',
	'az' => 'Azeri',
	'eu' => 'Basque',
	'be' => 'Belarusian',
	'bn' => 'Bengali',
	'bg' => 'Bulgarian',
	'ca' => 'Catalan',
	'zh-cn' => 'Chinese (China)',
	'zh-hk' => 'Chinese (Hong Kong SAR)',
	'zh-mo' => 'Chinese (Macau SAR)',
	'zh-sg' => 'Chinese (Singapore)',
	'zh-tw' => 'Chinese (Taiwan)',
	'zh' => 'Chinese',
	'hr' => 'Croatian',
	'cs' => 'Chech',
	'da' => 'Danish',
	'div' => 'Divehi',
	'nl-be' => 'Dutch (Belgium)',
	'nl' => 'Dutch (Netherlands)',
	'en-au' => 'English (Australia)',
	'en-bz' => 'English (Belize)',
	'en-ca' => 'English (Canada)',
	'en-ie' => 'English (Ireland)',
	'en-jm' => 'English (Jamaica)',
	'en-nz' => 'English (New Zealand)',
	'en-ph' => 'English (Philippines)',
	'en-za' => 'English (South Africa)',
	'en-tt' => 'English (Trinidad)',
	'en-gb' => 'English (United Kingdom)',
	'en-us' => 'English (United States)',
	'en-zw' => 'English (Zimbabwe)',
	'en' => 'English',
	'et' => 'Estonian',
	'fo' => 'Faeroese',
	'fa' => 'Farsi',
	'fi' => 'Finnish',
	'fr-be' => 'French (Belgium)',
	'fr-ca' => 'French (Canada)',
	'fr-lu' => 'French (Luxembourg)',
	'fr-mc' => 'French (Monaco)',
	'fr-ch' => 'French (Switzerland)',
	'fr' => 'French (France)',
	'mk' => 'FYRO Macedonian',
	'gd' => 'Gaelic',
	'ka' => 'Georgian',
	'de-at' => 'German (Austria)',
	'de-li' => 'German (Liechtenstein)',
	'de-lu' => 'German (lexumbourg)',
	'de-ch' => 'German (Switzerland)',
	'de' => 'German (Germany)',
	'el' => 'Greek',
	'gu' => 'Gujarati',
	'he' => 'Hebrew',
	'hi' => 'Hindi',
	'hu' => 'Hungarian',
	'is' => 'Icelandic',
	'id' => 'Indonesian',
	'it-ch' => 'Italian (Switzerland)',
	'it' => 'Italian (Italy)',
	'ja' => 'Japanese',
	'kn' => 'Kannada',
	'kk' => 'Kazakh',
	'kok' => 'Konkani',
	'ko' => 'Korean',
	'kz' => 'Kyrgyz',
	'lv' => 'Latvian',
	'lt' => 'Lithuanian',
	'ms' => 'Malay',
	'ml' => 'Malayalam',
	'mt' => 'Maltese',
	'mr' => 'Marathi',
	'mn' => 'Mongolian (Cyrillic)',
	'ne' => 'Nepali (India)',
	'nb-no' => 'Norwegian (Bokmal)',
	'nn-no' => 'Norwegian (Nynorsk)',
	'no' => 'Norwegian (Bokmal)',
	'or' => 'Oriya',
	'pl' => 'Polish',
	'pt-br' => 'Portuguese (Brazil)',
	'pt' => 'Portuguese (Portugal)',
	'pa' => 'Punjabi',
	'rm' => 'Rhaeto-Romanic',
	'ro-md' => 'Romanian (Moldova)',
	'ro' => 'Romanian',
	'ru-md' => 'Russian (Moldova)',
	'ru' => 'Russian',
	'sa' => 'Sanskrit',
	'sr' => 'Serbian',
	'sk' => 'Slovak',
	'ls' => 'Slovenian',
	'sb' => 'Sorbian',
	'es-ar' => 'Spanish (Argentina)',
	'es-bo' => 'Spanish (Bolivia)',
	'es-cl' => 'Spanish (Chile)',
	'es-co' => 'Spanish (Colombia)',
	'es-cr' => 'Spanish (Costa Rica)',
	'es-do' => 'Spanish (Dominican Republic)',
	'es-ec' => 'Spanish (Ecuador)',
	'es-sv' => 'Spanish (El Salvador)',
	'es-gt' => 'Spanish (Guatemala)',
	'es-hn' => 'Spanish (Honduras)',
	'es-mx' => 'Spanish (Mexico)',
	'es-ni' => 'Spanish (Nicaragua)',
	'es-pa' => 'Spanish (Panama)',
	'es-py' => 'Spanish (Paraguay)',
	'es-pe' => 'Spanish (Peru)',
	'es-pr' => 'Spanish (Puerto Rico)',
	'es-us' => 'Spanish (United States)',
	'es-uy' => 'Spanish (Uruguay)',
	'es-ve' => 'Spanish (Venezuela)',
	'es' => 'Spanish (Traditional Sort)',
	'sx' => 'Sutu',
	'sw' => 'Swahili',
	'sv-fi' => 'Swedish (Finland)',
	'sv' => 'Swedish',
	'syr' => 'Syriac',
	'ta' => 'Tamil',
	'tt' => 'Tatar',
	'te' => 'Telugu',
	'th' => 'Thai',
	'ts' => 'Tsonga',
	'tn' => 'Tswana',
	'tr' => 'Turkish',
	'uk' => 'Ukrainian',
	'ur' => 'Urdu',
	'uz' => 'Uzbek',
	'vi' => 'Vietnamese',
	'xh' => 'Xhosa',
	'yi' => 'Yiddish',
	'zu' => 'Zulu' );

	return $a_languages;
}
?> 

onoehring
Veteran Member
Posts: 241
Joined: 2019-05-21 22:42
Contact:

Re: Define application language / let users choose language

Post by onoehring » 2019-06-12 09:38

Hi,

I checked the developers page https://techpatterns.com/downloads/php_ ... ection.php
And there is a newer version available (attached to this post)
php_language_detection.zip
(7.11 KiB) Downloaded 10 times
Olaf

onoehring
Veteran Member
Posts: 241
Joined: 2019-05-21 22:42
Contact:

Re: Define application language / let users choose language

Post by onoehring » 2019-06-13 17:05

Hi pbötcher,

I wanted to say thanks for your suggested workflow and your code.
I created a subfolder like you suggested and use a different table.
Olaf

Post Reply