       text: (val) -> val.replace(/^https?:\/\//, '')
 
 
+  textMapping =
+    join_date: (val) ->
+      joinDate = moment(val)
+      joinDateTitle = joinDate.format('LL')
+
+      if joinDate.isBefore moment('2008-01-01')
+        title: joinDateTitle
+        html: osu.trans 'users.show.first_members'
+      else
+        html: osu.trans 'users.show.joined_at',
+          date: rowValue joinDate.format(osu.trans('common.datetime.year_month.moment')),
+            title: joinDateTitle
+
+    last_visit: (val) ->
+      html: osu.trans 'users.show.lastvisit',
+        date: rowValue osu.timeago(val)
+
+    playstyle: (val) ->
+      playsWith = val.map (s) ->
+        osu.trans "common.device.#{s}"
+      .join ', '
+
+      html: osu.trans 'users.show.plays_with', devices: rowValue(playsWith)
+
+    post_count: (val, user) ->
+      count = osu.transChoice 'users.show.post_count.count', val.toLocaleString()
+      url = laroute.route('users.posts', user: user.id)
+
+      html:
+        osu.trans 'users.show.post_count._', link: rowValue(count, href: url)
+
+
   render: =>
     rows = [
-      [
-        @renderJoinDate()
-        @renderLastVisit()
-        @renderPlaystyle()
-        @renderPostCount()
-      ]
+      ['join_date', 'last_visit', 'playstyle', 'post_count'].map @renderText
       ['location', 'interests', 'occupation'].map @renderLink
       ['twitter', 'discord', 'skype', 'lastfm', 'website'].map @renderLink
     ]

        className: componentClass
        text?(value) ? value

  renderPlaystyle: =>
    value = @props.user.playstyle

    return unless value?

    playsWith = value.map (s) ->
      osu.trans "common.device.#{s}"
    .join ', '

    div
      className: "#{bn}__item"
      key: 'playstyle'
      dangerouslySetInnerHTML:
        __html:
          osu.trans 'users.show.plays_with',
            devices: rowValue playsWith


  renderPostCount: =>
    count = osu.transChoice 'users.show.post_count.count', @props.user.post_count.toLocaleString()
    url = laroute.route('users.posts', user: @props.user.id)

    div
      className: "#{bn}__item"
      key: 'post_count'
      dangerouslySetInnerHTML:
        __html:
          osu.trans 'users.show.post_count._',
            link: rowValue count, href: url

    div className: bn,
      for row, j in rows when _.compact(row).length > 0
        div key: j, className: "#{bn}__row #{bn}__row--#{j}", row


  renderLink: (key) =>
