In your arabic text example, the prevailing direction of the text has been set to right-to-left. A bracket takes the direction of the prevailing language if it is between right-to-left and left-to-right text. So in your example if you would change the text to have a word after the brackets the problem would go away. I would suggest you test it with added words to understand the solution.
This is cumbersome and for your production code, I would suggest another solution. Assuming you know that the brackets only occur in your left to right languages, you need to terminate the bracket with a unicode control character (Try adding this to your test manually). So my solution in this case is just replace the brackets, with brackets and control characters:
for lv in language_versions:
language = LANGUAGES[lv.language_code]
if lv.language_code == user_language_code:
language_label = (lv.language_code, u"%s" % (language.name_native))
else:
native = language.name_native.replace(u')', u')\u200E') # I haven't tested this and you might have to add the html character code ‎ here. please edit this if you find that to be the case.
language_label = (lv.language_code, u"%s / %s" % (language.name, native))
available_languages.append(language_label)
Obviously if you have brackets in your right-to-left languages, you'll have to first test what the use_language_code's direction, and then only update the native language, if appropriate (ltr in rtl and vice versa)...