How to let users change site language?

There are two types of translations in the WordPress website:

  1. Label Translation in WordPress Core and Theme, for that gettext
    technique is useful (as mentioned by you .po and .mo files)
  2. Content Translations for that you will need to add multi-lingual
    plugin to handle such feature. Good Example of such plugin are: