Jump to content

How can I get the user profile language?


enricob
 Share

Recommended Posts

Hi all,

I know I can get the current user navigation language using this query:

$currentUser = $pages->get("template=user, id=".$user->id);

$currentUserLanguage = $currentUser->language->name;

or directly:

$currentUserLanguage = $user->language->name;

Now, if I am viewing the site with this user and change navigation language using the language switcher the value of  $userLanguage changes accordingly.

However, the REAL user language as seen in the user profile on the admin panel doesn't change.

So, my question is: how can I get the user profile language as set in the user profile?

Thank you!

Link to comment
Share on other sites

You have answered your question by yourself already :)

$user->language->name will not change, you said you switch the value of $currentUserLanguage, so you can query every time for $user->language->name again.

Link to comment
Share on other sites

Maybe I am not explained myself clearly but the fact is that the variable $user->language->name changes, reflecting the language I switched to on the frontend.

But when I look at the profile of the same user on the admin panel the language has not changed...Even if I look directly at the database I see that the language field of the page user (for the user I am viewing the site with) stays the same, even if I am switching the language on the frontend.

I think the point here is that Processwire automatically populate the variable $user->language with the currently active language, in some way overriding the actual language associated with that user.

In fact if I do the same query to get an user (but not the user I am logged in), the value of $userObject->language is exactly what I expect.

Link to comment
Share on other sites

ProcessWire does change the $user->language? What kind of language switcher you are using? A pointing link or code example would be helpful, or is it some example that comes with a PW site profile?

Link to comment
Share on other sites

User language is tied to what language is requested. So it changes on runtime.

User language set in admin is for backend primary. If you need user to set a language for frontend you could add a field to user and check that.

  • Like 1
Link to comment
Share on other sites

Thanks Soma, that's what I though...

But if you check the value of the language field of the current user object while he's viewing the site (not by querying the $user object, but for example looking at the database) you'll see that the value never change when the user change the navigation language, while $user->language value does.

So, if $user->language give me the current navigation language (that changes at runtime) how do I get the language value of the current user though the api?

Link to comment
Share on other sites

I would not use the $user var to get the saved value. I think it should be possible to call this: (but have not tested it yet)

$id = $user->id;

$savedLanguage = $users->get($id)->language->name;
Link to comment
Share on other sites

@horst in the LanguageSupportPageNames.module I guess. It's evaluated with some AI to get the right language and page.

Once the language is determined by the requested url the user language is set on runtime. It's not saved in DB of course.

I would not use the $user var to get the saved value. I think it should be possible to call this: (but have not tested it yet)

$id = $user->id;

$savedLanguage = $users->get($id)->language->name;

This would load the cached user already with changed language.

Thanks Soma, that's what I though...

But if you check the value of the language field of the current user object while he's viewing the site (not by querying the $user object, but for example looking at the database) you'll see that the value never change when the user change the navigation language, while $user->language value does.

So, if $user->language give me the current navigation language (that changes at runtime) how do I get the language value of the current user though the api?

This is determined very early before page renders etc. So only way without adding your own field to manage this, would be to save the language to the user with a new property (at runtime) and this should happen before LanguageSupportPageNames does it's job. In template code you won't be able to do this unless you do a DB manual query.

So an autoload module would do that with an added hook line of code in the init() (see HelloWorld.module)

public function init() {
    $this->wire("user")->savedLanguage = $this->wire("user")->language;
}

and then use in templates:

echo $user->savedLanguage->name;
  • Like 4
Link to comment
Share on other sites

I had the same problem,, and there is actually a way to access the profile language without using a hook by calliing loadPageField function of a Fieldtype, which fetches the data directly in the database:

$languageField = $fields->get("language");
$profileLanguageId = $languageField->type->loadPageField($user, $languageField)[0];
$profileLanguage = $pages->get("id=$profileLanguageId");
Link to comment
Share on other sites

I had the same problem,, and there is actually a way to access the profile language without using a hook by calliing loadPageField function of a Fieldtype, which fetches the data directly in the database:

$languageField = $fields->get("language");
$profileLanguageId = $languageField->type->loadPageField($user, $languageField)[0];
$profileLanguage = $pages->get("id=$profileLanguageId");

What hook?

Looks complicated. ;)

Link to comment
Share on other sites

You could also do

$current_lang = $user->language;
$pages->uncacheAll();
$saved_lang = $user->language;
$user->language = $current_lang; // reset

So it will reload the user. But you have to reset it back afterwards. (And I'm not sure a $pages->uncacheAll() will make processwire reload all pages already in cache. So I'm not sure it's a good solution if not really needed. )

Link to comment
Share on other sites

Indeed, no hook, I hadn't read it through thoroughly enough and had assumed module = hook. :-[

And your solution is indeed less complicated, I think I'll replace mine by yours, it makes the code much easier to read :)

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...