I solved this adding "bundle" at the beginning of all the entries in global_en.properties:
...
bundle.categoryDto.id=ID
...
...
bundle.articleDto.categoryDto.id=Category
...
and than in the form:
<s:select name="bundle.articleDto.categoryDto.id" />
Solved, but still dont know why struts2 wasn't able to recognize the previous solution. The problem is in getText(). It searches in the value stack that contains also action variable. And in the action I have an ArticleDto, with getter and setter. If I remove the getter, all goes fine. This getter seems to go in some strange conflict.