diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php
index 0e71ef966e..7cec63eb81 100644
--- a/src/wp-includes/rest-api/class-wp-rest-server.php
+++ b/src/wp-includes/rest-api/class-wp-rest-server.php
@@ -325,6 +325,12 @@ class WP_REST_Server {
 
 		$result = $this->check_authentication();
 
+		$restore_locale = false;
+
+		if ( isset( $_GET['_locale'] ) && 'user' === $_GET['_locale'] && is_user_logged_in() ) {
+			$restore_locale = switch_to_locale( get_user_locale() );
+		}
+
 		if ( ! is_wp_error( $result ) ) {
 			$result = $this->dispatch( $request );
 		}
@@ -417,6 +423,10 @@ class WP_REST_Server {
 			} else {
 				echo $result;
 			}
+
+			if ( $restore_locale ) {
+				restore_previous_locale();
+			}
 		}
 		return null;
 	}
diff --git a/tests/phpunit/data/languages/de_DE.mo b/tests/phpunit/data/languages/de_DE.mo
index b65a14e19c..4f5963c989 100644
Binary files a/tests/phpunit/data/languages/de_DE.mo and b/tests/phpunit/data/languages/de_DE.mo differ
diff --git a/tests/phpunit/data/languages/de_DE.po b/tests/phpunit/data/languages/de_DE.po
index 4d66b76c10..b521e9b765 100644
--- a/tests/phpunit/data/languages/de_DE.po
+++ b/tests/phpunit/data/languages/de_DE.po
@@ -2,7 +2,7 @@
 # This file is distributed under the same license as the 4.9.x package.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2018-08-13 19:19+0300\n"
+"PO-Revision-Date: 2018-09-05 00:19-0400\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -48,3 +48,8 @@ msgstr "Jetzt %s aktualisieren"
 #: wp-includes/user.php:3445
 msgid "[%1$s] Confirm Action: %2$s"
 msgstr "[%1$s] Aktion bestätigen: %2$s"
+
+#: wp-includes/post.php:1444
+msgctxt "post type general name"
+msgid "Posts"
+msgstr "Beiträge"
diff --git a/tests/phpunit/data/languages/es_ES.mo b/tests/phpunit/data/languages/es_ES.mo
index d4c5767eaf..c091e232ca 100644
Binary files a/tests/phpunit/data/languages/es_ES.mo and b/tests/phpunit/data/languages/es_ES.mo differ
diff --git a/tests/phpunit/data/languages/es_ES.po b/tests/phpunit/data/languages/es_ES.po
index 6e03a32de2..89ce5155dc 100644
--- a/tests/phpunit/data/languages/es_ES.po
+++ b/tests/phpunit/data/languages/es_ES.po
@@ -2,7 +2,7 @@
 # This file is distributed under the same license as the Development (4.9.x) package.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2018-08-13 19:19+0300\n"
+"PO-Revision-Date: 2018-09-04 23:52-0400\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -44,3 +44,8 @@ msgstr "(Actualmente fijado en: %s)"
 #: wp-includes/user.php:3445
 msgid "[%1$s] Confirm Action: %2$s"
 msgstr "[%1$s] Confirma la acción: %2$s"
+
+#: wp-includes/post.php:1444
+msgctxt "post type general name"
+msgid "Posts"
+msgstr "Entradas"
diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php
index 9b6f0f50a1..9b2a77699e 100644
--- a/tests/phpunit/tests/rest-api/rest-server.php
+++ b/tests/phpunit/tests/rest-api/rest-server.php
@@ -1177,6 +1177,142 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 		);
 	}
 
+	public function test_locale_user() {
+
+		$locale = get_locale();
+
+		$user = self::factory()->user->create( array(
+			'locale' => 'es_ES',
+			'role'   => 'administrator',
+		) );
+		wp_set_current_user( $user );
+
+		$_GET['_locale']      = 'user';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Entradas', $decoded['name'] );
+		$this->assertEquals( $locale, get_locale() );
+
+		restore_previous_locale();
+	}
+
+	public function test_locale_user_none_set() {
+
+		$locale = get_locale();
+
+		$user = self::factory()->user->create( array(
+			'role' => 'administrator',
+		) );
+		wp_set_current_user( $user );
+
+		$_GET['_locale']      = 'user';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Posts', $decoded['name'] );
+		$this->assertEquals( $locale, get_locale() );
+
+		restore_previous_locale();
+	}
+
+	public function test_locale_user_logged_out() {
+
+		$_GET['_locale']      = 'user';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Posts', $decoded['name'] );
+
+		restore_previous_locale();
+	}
+
+	public function test_locale_site() {
+
+		$locale = get_locale();
+
+		$user = self::factory()->user->create( array(
+			'role' => 'administrator',
+		) );
+		wp_set_current_user( $user );
+
+		$_GET['_locale']      = 'site';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Posts', $decoded['name'] );
+		$this->assertEquals( $locale, get_locale() );
+
+		restore_previous_locale();
+	}
+
+	public function test_locale_site_logged_out() {
+
+		$_GET['_locale']      = 'site';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Posts', $decoded['name'] );
+
+		restore_previous_locale();
+	}
+
+	public function test_locale_site_already_switched_retains_switch() {
+
+		switch_to_locale( 'de_DE' );
+
+		$user = self::factory()->user->create( array(
+			'locale' => 'es_ES',
+			'role'   => 'administrator',
+		) );
+		wp_set_current_user( $user );
+
+		$_GET['_locale']      = 'site';
+		$_REQUEST['_wpnonce'] = wp_create_nonce( 'wp_rest' );
+
+		rest_get_server()->serve_request( '/wp/v2/types/post' );
+		$json = rest_get_server()->sent_body;
+
+		$decoded = json_decode( $json, true );
+
+		$this->assertInternalType( 'array', $decoded );
+		$this->assertArrayHasKey( 'name', $decoded );
+		$this->assertEquals( 'Beiträge', $decoded['name'] );
+		$this->assertEquals( 'de_DE', get_locale() );
+
+		restore_previous_locale();
+	}
+
 	/**
 	 * Helper to setup a users and auth cookie global for the
 	 * rest_send_refreshed_nonce related tests.
