Опыт показывает, что лучше не использовать ключи для строк, а указывать сразу сами строки. То есть не
KOLocalized(key:"kChangeLanguage")
а прямо
KOLocalized(key:"Change Language")
Во-первых, когда возникнет необходимость использовать составные строки (например, «Last seen: %@ minutes ago», где значение отдельно от строки локализации), будет гораздо нагляднее.
Во-вторых, не нужно будет каждый раз лезть в плист, чтобы посмотреть, что подразумевается под ключем.
В-третьих, если в приложении используется какой-нибудь язык, с которым программист не знаком, то стороннему переводчику будет легче работать.
По поводу писать ключ или слово, фразу, здесь решать вам, для меня удобнее с ключами работать, а от того напишите вы так «kChangeLanguage» или «Change Language» суть особо не поменяется. Я всего лишь показал решение некоторых проблем.
Однажды тоже озадачился подобным вопросом, но решил в итоге иным способом. Остался тот же самый NSLocalizedString, но bundle откуда он брал данные менялся в рантайме. Таким образом еще и осталась поддержка локализации storyboard'ов и других файлов (но, чтобы storyboardы локализовались их нужно было пересоздать).
https://bitbucket.org/Planemo/ios-support/raw/master/LocalizedBundle/Bundle+Localization.swift
Альтернатива NSLocalizedString, смена языка без перезагрузки приложения