One approach to consider is following the model used by iGoogle, which utilizes a unique set of variables such as __BIDI_START_EDGE__, __BIDI_END_EDGE__, __BIDI_DIR__, and __BIDI_REVERSE_DIR. Instead of using traditional margin-left in your CSS rules, you can substitute it with margin-__BIDI_START_EDGE__. By implementing some server-side code that incorporates these variables based on the direction (ltr or rtl), you can achieve a flexible and robust solution.
While this method may require separate files for different directions, it provides the flexibility to selectively choose which elements should be flipped by using literal values like "left" or "right".
(Refer to this email from the OpenAjaxIDE mailing list, where IBM's localization experts endorse the BIDI features in OpenSocial and recommend their adoption for a project within the OpenAjax community.)