PoEdit and PHP annotations

2019-06-19 01:13发布

问题:

I'm looking for a way to make PoEdit understand PHP annotations. Here's a sample of code I want PoEdit to pick up and put into catalog:

class MyController extends Controller {

    /**
     * @Title "Home"
     */
    public function index() {
        ...
    }

}

The interesting part is @Title annotation. It is accessed in front controller and assigned to master view, effectively ending up inside <title>...</title> tag.

Now I need that string translated, but PoEdit seems to only understand _() expressions, and adding @Title to keywords does not work. This is probably because annotations in PHP are in comment block.

Is there any way to force PoEdit to understand annotations?

回答1:

Short answer, you can't.

POEdit uses xgettext to scan your files therefore using specific syntax, ignoring commented lines.

For example, if your keywords are _ the following examples will be parsed like:

_('test'); -> string 'test'

_("test"); -> string 'test'

_('test' -> string 'test'

_ 'test -> no catch

_('test -> no catch

_(test) -> no catch

_($test) -> no catch

//_('test'); -> no catch

/*_('test');*/ -> no catch

You can execute xgettext using other parameters but I'm not sure if you will be able to achieve your goal.


One easy fix (not standard ofc) is to add other keyword like placeholder and make a php function like

function placeholder($string){}

and use it so POEdit can parse it

class MyController extends Controller {

    /**
     * @Title "Home"
     */
    public function index() {
      placeholder('Home');  
      ...
    }

}

At your frontend parser just use the simple _($value) and you will have your title translated.

Dunno how is your code but will assume its something similar to this.

Assuming that $tag = 'title' and $value = 'Home'

echo '<'.$tag.'>'._($value).'</'.$tag.'>';


回答2:

If you really want to do this that way then you can just extract the strings you need from php files to an external file, while replacing the annotation part with _(string); for each match and run Poedit on that file.

You can match it with .*\*\s\@(\w+)\s\"(\w+)\".* - $1 in the match will be annotation (Title), $2 will be the value: (Home)