···55 jsonStringToLex,
66} from '@atproto/api'
7788-import {getContentLanguages} from '#/state/preferences/languages'
88+import {
99+ getAppLanguageAsContentLanguage,
1010+ getContentLanguages,
1111+} from '#/state/preferences/languages'
912import {FeedAPI, FeedAPIResponse} from './types'
1013import {createBskyTopicsHeader, isBlueskyOwnedFeed} from './utils'
1114···103106 limit: number
104107 cursor?: string
105108}) {
106106- let contentLangs = getContentLanguages().join(',')
109109+ let contentLangs = getAppLanguageAsContentLanguage()
110110+111111+ /**
112112+ * Copied from our root `Agent` class
113113+ * @see https://github.com/bluesky-social/atproto/blob/60df3fc652b00cdff71dd9235d98a7a4bb828f05/packages/api/src/agent.ts#L120
114114+ */
115115+ const labelersHeader = {
116116+ 'atproto-accept-labelers': BskyAgent.appLabelers
117117+ .map(l => `${l};redact`)
118118+ .join(', '),
119119+ }
107120108121 // manually construct fetch call so we can add the `lang` cache-busting param
109122 let res = await fetch(
110123 `https://api.bsky.app/xrpc/app.bsky.feed.getFeed?feed=${feed}${
111124 cursor ? `&cursor=${cursor}` : ''
112125 }&limit=${limit}&lang=${contentLangs}`,
113113- {method: 'GET', headers: {'Accept-Language': contentLangs}},
126126+ {
127127+ method: 'GET',
128128+ headers: {'Accept-Language': contentLangs, ...labelersHeader},
129129+ },
114130 )
115131 let data = res.ok ? jsonStringToLex(await res.text()) : null
116132 if (data?.feed?.length) {
···125141 `https://api.bsky.app/xrpc/app.bsky.feed.getFeed?feed=${feed}${
126142 cursor ? `&cursor=${cursor}` : ''
127143 }&limit=${limit}`,
128128- {method: 'GET', headers: {'Accept-Language': ''}},
144144+ {method: 'GET', headers: {'Accept-Language': '', ...labelersHeader}},
129145 )
130146 data = res.ok ? jsonStringToLex(await res.text()) : null
131147 if (data?.feed?.length) {
+10
src/state/preferences/languages.tsx
···139139 return persisted.get('languagePrefs').contentLanguages
140140}
141141142142+/**
143143+ * Be careful with this. It's used for the PWI home screen so that users can
144144+ * select a UI language and have it apply to the fetched Discover feed.
145145+ *
146146+ * We only support BCP-47 two-letter codes here, hence the split.
147147+ */
148148+export function getAppLanguageAsContentLanguage() {
149149+ return persisted.get('languagePrefs').appLanguage.split('-')[0]
150150+}
151151+142152export function toPostLanguages(postLanguage: string): string[] {
143153 // filter out empty strings if exist
144154 return postLanguage.split(',').filter(Boolean)