public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_publish_profile, container, false);

    Bundle args = getArguments();
    String targetTranslationId = args.getString(PublishActivity.EXTRA_TARGET_TRANSLATION_ID);
    Translator translator = AppContext.getTranslator();
    mTargetTranslation = translator.getTargetTranslation(targetTranslationId);

    mNameText = (EditText) rootView.findViewById(R.id.name_edittext);
    mEmailText = (EditText) rootView.findViewById(R.id.email_edittext);
    mPhoneText = (EditText) rootView.findViewById(R.id.phone_edittext);

    // buttons
    ImageButton nameInfoButton = (ImageButton) rootView.findViewById(R.id.name_info_button);
    ViewUtil.tintViewDrawable(nameInfoButton, getResources().getColor(R.color.dark_secondary_text));
    ImageButton emailInfoButton = (ImageButton) rootView.findViewById(R.id.email_info_button);
    ViewUtil.tintViewDrawable(
        emailInfoButton, getResources().getColor(R.color.dark_secondary_text));
    ImageButton phoneInfoButton = (ImageButton) rootView.findViewById(R.id.phone_info_button);
    ViewUtil.tintViewDrawable(
        phoneInfoButton, getResources().getColor(R.color.dark_secondary_text));

    mContributor = (View) rootView.findViewById(R.id.contributor_button);
    mContributorToggle = (TextView) rootView.findViewById(R.id.toggle_contributor);

    mContributorToggle.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            getNextTranslator();
          }
        });

    nameInfoButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            showPrivacyNotice(rootView, true);
          }
        });
    emailInfoButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            showPrivacyNotice(rootView, true);
          }
        });
    phoneInfoButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            showPrivacyNotice(rootView, true);
          }
        });

    Button addContributorButton = (Button) rootView.findViewById(R.id.add_contributor_button);
    addContributorButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            NativeSpeaker translator = saveCurrentTranslator();
            showTranslator(translator.name);
          }
        });

    addContributorButton.setVisibility(
        View.GONE); // TODO remove to re-enable support for multiple contributors

    ImageButton deleteContributorButton =
        (ImageButton) rootView.findViewById(R.id.delete_contributor_button);
    deleteContributorButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {

            final CustomAlertDialog dlg = CustomAlertDialog.Create(getActivity());
            dlg.setTitle(R.string.delete_translator_title)
                .setMessageHtml(R.string.confirm_delete_translator)
                .setPositiveButton(
                    R.string.confirm,
                    new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {

                        String name = mContributorToggle.getText().toString();
                        mTargetTranslation.removeTranslator(name);
                        updateTranslator();

                        dlg.dismiss();
                      }
                    })
                .setNegativeButton(R.string.title_cancel, null)
                .show("DeleteTrans");
          }
        });

    Button nextButton = (Button) rootView.findViewById(R.id.next_button);
    nextButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            if (mNameText.getText().toString().isEmpty()
                || mEmailText.getText().toString().isEmpty()) {
              Snackbar snack =
                  Snackbar.make(
                      getActivity().findViewById(android.R.id.content),
                      R.string.complete_required_fields,
                      Snackbar.LENGTH_SHORT);
              ViewUtil.setSnackBarTextColor(
                  snack, getResources().getColor(R.color.light_primary_text));
              snack.show();
            } else {
              showPrivacyNotice(rootView, false);
            }
          }
        });

    updateTranslator();

    return rootView;
  }
  /** Performs the backup if nessesary */
  private void runBackup() {
    boolean backupPerformed = false;
    Translator translator = AppContext.getTranslator();
    TargetTranslation[] targetTranslations = translator.getTargetTranslations();
    for (TargetTranslation t : targetTranslations) {

      // commit pending changes
      try {
        t.commit();
      } catch (Exception e) {
        Logger.e(this.getClass().getName(), "Failed to commit changes before backing up", e);
        continue;
      }

      // run backup if there are translations
      if (t.numTranslated() > 0) {

        // retreive commit hash
        String tag;
        try {
          tag = t.getCommitHash();
        } catch (Exception e) {
          Logger.w(this.getClass().getName(), "Failed to read commit hash", e);
          continue;
        }

        // check if backup is required
        if (tag != null) {
          File primaryBackupDir =
              new File(AppContext.getPublicDirectory(), "backups/" + t.getId() + "/");
          File primaryBackupFile =
              new File(primaryBackupDir, tag + "." + Translator.ARCHIVE_EXTENSION);
          File downloadBackupDir =
              new File(AppContext.getPublicDownloadsDirectory(), "backups/" + t.getId() + "/");
          File downloadBackupFile =
              new File(downloadBackupDir, tag + "." + Translator.ARCHIVE_EXTENSION);
          // e.g. ../../backups/uw-obs-de/[commit hash].tstudio
          if (!downloadBackupFile.exists()) {

            // peform backup
            File archive =
                new File(
                    AppContext.getPublicDownloadsDirectory(),
                    t.getId() + ".temp." + Translator.ARCHIVE_EXTENSION);
            try {
              translator.exportArchive(t, archive);
            } catch (Exception e) {
              Logger.e(
                  this.getClass().getName(),
                  "Failed to export the target translation " + t.getId(),
                  e);
              continue;
            }
            if (archive.exists() && archive.isFile()) {
              // move into backup
              FileUtils.deleteQuietly(downloadBackupDir);
              FileUtils.deleteQuietly(primaryBackupDir);
              downloadBackupDir.mkdirs();
              primaryBackupDir.mkdirs();
              try {
                // backup to downloads directory
                FileUtils.copyFile(archive, downloadBackupFile);
                // backup to a slightly less public area (used for auto restore)
                FileUtils.copyFile(archive, primaryBackupFile);
                backupPerformed = true;
              } catch (IOException e) {
                Logger.e(
                    this.getClass().getName(),
                    "Failed to copy the backup archive for target translation: " + t.getId(),
                    e);
              }
              archive.delete();
            } else {
              Logger.w(
                  this.getClass().getName(),
                  "Failed to export the target translation: " + t.getId());
            }
          }
        } else {
          Logger.w(this.getClass().getName(), "Could not find the commit hash");
        }
      }
    }

    if (backupPerformed) {
      onBackupComplete();
    }
  }