The best practice depends on the intended use of the theme: Is it a theme that is going to be distributed and reused or is it a project specific theme?
1. Distributed Theme, intended for reuse
Avoid using translate.csv at all in this case. As soon as the end user adds his own translate.csv to his child theme, this will override yours (the usual them fallback mechanism applies). They would need to copy everything from the original file and keep track of changes.
Instead, use a theme module. Most themes come with one or more modules that contain mostly theme specific blocks, but also new translations. Then use Mage::helper('yourtheme')->__('your string') for translations and:
- You are safe from conflicts with third party modules
- Users can override this specific translation with
Your_Theme::your string in their translate.csv
2. Project specific theme
For translations in a project specific theme, translate.csv was invented, so I would use it.
You should know that the module scope is not directly connected to existing translations in the respective CSV files. So you can use an existing translation scope without adding a new module or modifying module CSV files.
For example if I add a custom translations, that is used on the product page within a Mage_Catalog block, the translation looks like this:
"Mage_Catalog::New translation","New translation"
More on how to find out the scope of a specific translation here: Translations and hierachy of authority
(or you could use my TranslationHints extension)
n98-magerun dev:translate:export– Alex Sep 14 '15 at 09:37