Jump to content

Use language from public side on ACP task


Adriano Faria
 Share

Recommended Posts

It may seem a stupid question but I really don't remember if there's a way.

Long story short: I have a task that creates a topic and the post content is using the ACP language set which is different from the public side. User uses French in public side and English on ACP. As task runs on ACP, it is using English on posts. I can change a language but it's a per member basis and it is a task, not a member firing the action.

\IPS\Member::loggedIn()->acp_language = $id;

Is there a way to set the public side language in the task?

 

 

Link to comment
Share on other sites

11 minutes ago, bfarber said:

Well, stepping back, you shouldn't be calling to anything related to \IPS\Member::loggedIn() in a task. Tasks can be executed via cron, which have no session instance.

I would recommend rethinking how you are retrieving the language strings in the task.

No, i’m not using. I just show how can I change the lang but it doesn’t apply exactly because it’s a task. 

What I need is to know how to use front end lang instead of ACP lang in the created topic, which is fired by a task.

Edited by Adriano Faria
Link to comment
Share on other sites

Not really understand. But \IPS\Member::loggedIn()->language(true) - returned front-end of the current user \IPS\Lang object. After that you can get any language kay values with \IPS\Member::loggedIn()->language()->addToStack(...); where ... - you can just put a key or use it with sprintf. Without true param calling \IPS\Lang object will contain acp language too. So, for example, if your task need to send some text to some user and content of this text should contain right language from lang-keys - so you may use something like \IPS\Member::load(123456)->language()->addToStack('some_key'); - it will put correct value for your text on the selected by this member preffered lang (or default).

Link to comment
Share on other sites

10 minutes ago, Upgradeovec said:

Not really understand. But \IPS\Member::loggedIn()->language(true) - returned front-end of the current user \IPS\Lang object. After that you can get any language kay values with \IPS\Member::loggedIn()->language()->addToStack(...); where ... - you can just put a key or use it with sprintf. Without true param calling \IPS\Lang object will contain acp language too. So, for example, if your task need to send some text to some user and content of this text should contain right language from lang-keys - so you may use something like \IPS\Member::load(123456)->language()->addToStack('some_key'); - it will put correct value for your text on the selected by this member preffered lang (or default).

That’s not the case. The task calls a method in my content item and this method creates a topic based on a template, which has lang bits.  I don’t use lang bits in the task.

Link to comment
Share on other sites

Your best bet is something like this....

$language = \IPS\Lang::load( \IPS\Member::loggedIn()->language ?: \IPS\Lang::defaultLanguage() );

$langBit =  $language->addToStack('...');

 

The language() method of \IPS\Member does have a $frontOnly parameter, however the method also leverages caching of the language object, so it wouldn't really help in this case.

Link to comment
Share on other sites

6 minutes ago, bfarber said:

Your best bet is something like this....

The only problem here is that I don't have a lang bit to call in the task. It has something like this:

			...
			$this->updateTopicWithResult( $raffle, $winnerArray );
			...

then:

	protected function updateTopicWithResult( \IPS\raffles\Raffle $raffle, $winners )
	{
		/* Get */
		try
		{
			$topic 		= \IPS\forums\Topic::load( $raffle->topicid );
			$content 	= \IPS\Theme::i()->getTemplate( 'submit', 'raffles', 'front' )->updateTopicWithWinners( $raffle->id, $raffle->type, $winners );
			\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $content );
			$post		= \IPS\forums\Topic\Post::create( $topic, $content, FALSE, NULL, NULL, $raffle->author() );
			$post->post = $content;
			$post->save();
		}
		catch ( \OutOfRangeException $e )
		{
			return;
		}
	}

The langs are in the updateTopicWithWinners template.

Link to comment
Share on other sites

Your approach here is problematic.

			$content 	= \IPS\Theme::i()->getTemplate( 'submit', 'raffles', 'front' )->updateTopicWithWinners( $raffle->id, $raffle->type, $winners );
			\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $content );

This relies on a logged in member (again there won't be any when tasks run via cron). Also \IPS\Theme checks the dispatcher location, which won't be set for tasks run via cron.

Instead of using a template, I'd probably recommend approaching this differently.

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...