It's great that you managed to write this in coffescript. Unfortunately, I'm still not convinced that this is the best solution. :-( Here are my concerns...

From your implementation it still isn't obvious to me why you don't simply register __ as a handlebar helper like this:

    Handlebars.registerHelper '__', Meteor._TranslatorService.translate

or this

    Handlebars.registerHelper 't', Meteor._TranslatorService.translate

And call it from your script like this:

    {{{__ "my.message.id" param1="optional param" param2=url}}}

or this

    {{{t "my.message.id" param1="optional param" param2=url}}}

See handlebar's documentation for the hash argument syntax...

Or of course without parameters:

    {{{__ "my.message.id"}}} or {{{t "my.message.id"}}}

What error do you get if you try this? Why would 'string' ever contain nothing? If you absolutely need to check this, you could do so directly in the translate-Method. This would have the advantage that you get more consistent behaviour of the translation function across handlebars /and/ JS.

And what's that string, content and {message: ...} stuff about? __ expects a message id and optional dynamic replacement parameters. The way you implemented it you'll disable the parameter replacement logic and you'll get an inconsistent API between handlebars and JS implementations.

Finally your code could be written more concisely the "coffeescript" way (no semicolon, no return statement, no unnecessary local variables, everything-is-an-expression principle). But that's just a besides as the other points need to become clear to me first.

    # Global Handlebars helper
    Handlebars.registerHelper '__', (messageId, params = {}) ->
      if messageId
        Meteor._TranslatorService.translate(messageId, params)
      else
        ''