Index: src/wp-includes/class-wp-site-query.php
===================================================================
--- src/wp-includes/class-wp-site-query.php	(revision 40301)
+++ src/wp-includes/class-wp-site-query.php	(working copy)
@@ -99,6 +99,7 @@
 	 * Sets up the site query, based on the query vars passed.
 	 *
 	 * @since 4.6.0
+	 * @since 4.8.0 Introduced 'lang_id' parameter.
 	 * @access public
 	 *
 	 * @param string|array $query {
@@ -138,6 +139,7 @@
 	 *     @type int          $mature            Limit results to mature sites. Accepts '1' or '0'. Default empty.
 	 *     @type int          $spam              Limit results to spam sites. Accepts '1' or '0'. Default empty.
 	 *     @type int          $deleted           Limit results to deleted sites. Accepts '1' or '0'. Default empty.
+	 *     @type int          $lang_id           Limit results to a language ID. Default empty.
 	 *     @type string       $search            Search term(s) to retrieve matching sites for. Default empty.
 	 *     @type array        $search_columns    Array of column names to be searched. Accepts 'domain' and 'path'.
 	 *                                           Default empty array.
@@ -169,6 +171,7 @@
 			'mature'            => null,
 			'spam'              => null,
 			'deleted'           => null,
+			'lang_id'           => null,
 			'search'            => '',
 			'search_columns'    => array(),
 			'count'             => false,
@@ -471,6 +474,11 @@
 			$this->sql_clauses['where']['public'] = $wpdb->prepare( "public = %d ", $public );
 		}
 
+		if ( is_numeric( $this->query_vars['lang_id'] ) ) {
+			$lang_id = absint( $this->query_vars['lang_id'] );
+			$this->sql_clauses['where']['lang_id'] = $wpdb->prepare( "lang_id = %d ", $lang_id );
+		}
+
 		// Falsey search strings are ignored.
 		if ( strlen( $this->query_vars['search'] ) ) {
 			$search_columns = array();
Index: src/wp-includes/ms-blogs.php
===================================================================
--- src/wp-includes/ms-blogs.php	(revision 40301)
+++ src/wp-includes/ms-blogs.php	(working copy)
@@ -556,6 +556,7 @@
  * Retrieves a list of sites matching requested arguments.
  *
  * @since 4.6.0
+ * @since 4.8.0 Introduced 'lang_id' parameter.
  *
  * @see WP_Site_Query::parse_query()
  *
@@ -596,6 +597,7 @@
  *     @type int          $mature            Limit results to mature sites. Accepts '1' or '0'. Default empty.
  *     @type int          $spam              Limit results to spam sites. Accepts '1' or '0'. Default empty.
  *     @type int          $deleted           Limit results to deleted sites. Accepts '1' or '0'. Default empty.
+ *     @type int          $lang_id           Limit results to a language ID. Default empty.
  *     @type string       $search            Search term(s) to retrieve matching sites for. Default empty.
  *     @type array        $search_columns    Array of column names to be searched. Accepts 'domain' and 'path'.
  *                                           Default empty array.
Index: tests/phpunit/tests/multisite/siteQuery.php
===================================================================
--- tests/phpunit/tests/multisite/siteQuery.php	(revision 40301)
+++ tests/phpunit/tests/multisite/siteQuery.php	(working copy)
@@ -431,6 +431,56 @@
 		$this->assertEqualSets( array_values( self::$site_ids ), $found );
 	}
 
+	public function test_wp_site_query_by_lang_id_with_zero() {
+		$q = new WP_Site_Query();
+		$found = $q->query( array(
+			'fields'       => 'ids',
+			// Exclude main site since we don't have control over it here.
+			'site__not_in' => array( 1 ),
+			'lang_id'      => 0,
+		) );
+
+		$this->assertEqualSets( array_values( self::$site_ids ), $found );
+	}
+
+	public function test_wp_site_query_by_lang_id() {
+		update_blog_details(
+			self::$site_ids['www.w.org/make/'],
+			array(
+				'lang_id' => 1,
+			)
+		);
+
+		$q = new WP_Site_Query();
+		$found = $q->query( array(
+			'fields'       => 'ids',
+			'lang_id'      => 1,
+		) );
+
+		update_blog_details(
+			self::$site_ids['www.w.org/make/'],
+			array(
+				'lang_id' => 0,
+			)
+		);
+
+		$expected = array(
+			self::$site_ids['www.w.org/make/'],
+		);
+
+		$this->assertEqualSets( $expected, $found );
+	}
+
+	public function test_wp_site_query_by_lang_id_with_no_results() {
+		$q = new WP_Site_Query();
+		$found = $q->query( array(
+			'fields'       => 'ids',
+			'lang_id'      => 2,
+		) );
+
+		$this->assertEmpty( $found );
+	}
+
 	public function test_wp_site_query_by_search_with_text_in_domain() {
 		$q = new WP_Site_Query();
 		$found = $q->query( array(
