Currently only by using the undocumented diet_translate__ function:

input(type="text", placeholder=diet_translate__("my_i18n_placeholder"))

I can't seem to get this to work.

Alternatively, a syntax using & would be an option:

input(type="text", placeholder&="my_i18n_placeholder")

This would definitely be my preference :)

On top of that, there should definitely also be an annotation, such as
@ignore, in the future. I'm just not sure so far if it is a good idea
to reuse vibe.data.serialization.ignore or if it's better to define a
new vibe.web.common.noRoute attribute. Probably the latter...

Well, it's currently @path(<route>), so @noPath should do. (or perhaps
an empty @path/@path(null)?)