Browse Source

选择国家时的翻译

main
Mac 2 weeks ago
parent
commit
35a57985e3
  1. 3
      app/screens/CountrySelect.tsx
  2. 2
      app/screens/SearchResultScreen.tsx
  3. 3
      app/screens/loginList/ForgotPhonePassword.tsx
  4. 3
      app/screens/loginList/PhoneLoginModal.tsx
  5. 8
      app/screens/previewOrder/perviewOrder.tsx
  6. 9
      app/screens/productStatus/OrderDatails.tsx
  7. 133
      app/utils/languageUtils.ts

3
app/screens/CountrySelect.tsx

@ -20,6 +20,7 @@ import type { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { RootStackParamList } from '../types/navigation'; import { RootStackParamList } from '../types/navigation';
import { settingApi } from '../services/api/setting'; import { settingApi } from '../services/api/setting';
import flagMap from '../utils/flagMap'; import flagMap from '../utils/flagMap';
import { getCountryTransLanguage } from '../utils/languageUtils';
const SELECTED_COUNTRY_KEY = '@selected_country'; const SELECTED_COUNTRY_KEY = '@selected_country';
@ -87,7 +88,7 @@ export const CountrySelect = () => {
<Text style={[ <Text style={[
styles.countryName, styles.countryName,
selectedCountry === item.country && styles.selectedText selectedCountry === item.country && styles.selectedText
]}>{item.name_en}</Text> ]}>{getCountryTransLanguage(item)}</Text>
{selectedCountry === item.country && ( {selectedCountry === item.country && (
<Text style={styles.checkmark}></Text> <Text style={styles.checkmark}></Text>

2
app/screens/SearchResultScreen.tsx

@ -451,7 +451,7 @@ export const SearchResultScreen = ({ route, navigation }: SearchResultScreenProp
// 处理点击产品 // 处理点击产品
const handleProductPress = useCallback( const handleProductPress = useCallback(
(product: Product) => { (product: Product) => {
if (product.original_min_price === 0 || product.original_min_price === null) { if (product.min_price === 0 || product.min_price === null) {
Toast.show({ Toast.show({
type: "error", type: "error",
text1: t("productDiscontinued"), text1: t("productDiscontinued"),

3
app/screens/loginList/ForgotPhonePassword.tsx

@ -20,6 +20,7 @@ import { CountryList } from "../../constants/countries";
import { settingApi } from "../../services/api/setting"; import { settingApi } from "../../services/api/setting";
import { VerificationCodeInput } from "./VerificationCodeInput"; import { VerificationCodeInput } from "./VerificationCodeInput";
import fontSize from "../../utils/fontsizeUtils"; import fontSize from "../../utils/fontsizeUtils";
import { getCountryTransLanguage } from "../../utils/languageUtils";
type ForgotPhonePasswordProps = { type ForgotPhonePasswordProps = {
visible?: boolean; visible?: boolean;
@ -171,7 +172,7 @@ export const ForgotPhonePassword = ({
> >
<View style={styles.countryItemContent}> <View style={styles.countryItemContent}>
<Text style={styles.countryCode}>+{item.country}</Text> <Text style={styles.countryCode}>+{item.country}</Text>
<Text style={[styles.countryName]}>{item.name_en}</Text> <Text style={[styles.countryName]}>{getCountryTransLanguage(item)}</Text>
</View> </View>
{/* Add checkmark for selected country */} {/* Add checkmark for selected country */}
{currentCountry && currentCountry.country === item.country && ( {currentCountry && currentCountry.country === item.country && (

3
app/screens/loginList/PhoneLoginModal.tsx

@ -30,6 +30,7 @@ import useBurialPointStore from "../../store/burialPoint";
import {getBurialPointData} from "../../store/burialPoint"; import {getBurialPointData} from "../../store/burialPoint";
import fontSize from "../../utils/fontsizeUtils"; import fontSize from "../../utils/fontsizeUtils";
import { changeLanguage } from "../../i18n"; import { changeLanguage } from "../../i18n";
import { getCountryTransLanguage } from "../../utils/languageUtils";
type RootStackParamList = { type RootStackParamList = {
Login: undefined; Login: undefined;
@ -195,7 +196,7 @@ const PhoneLoginModal = ({ visible, onClose }: PhoneLoginModalProps) => {
<View style={styles.countryItemContent}> <View style={styles.countryItemContent}>
<Text style={styles.countryCode}>+{item.country}</Text> <Text style={styles.countryCode}>+{item.country}</Text>
{/* <Image source={flagMap.get(item.name_en)} style={styles.flag} /> */} {/* <Image source={flagMap.get(item.name_en)} style={styles.flag} /> */}
<Text style={[styles.countryName]}>{item.name_en}</Text> <Text style={[styles.countryName]}>{getCountryTransLanguage(item)}</Text>
</View> </View>
{/* Add checkmark for selected country */} {/* Add checkmark for selected country */}
{selectedCountry && selectedCountry.country === item.country && ( {selectedCountry && selectedCountry.country === item.country && (

8
app/screens/previewOrder/perviewOrder.tsx

@ -37,11 +37,13 @@ import fontSize from "../../utils/fontsizeUtils";
import { getBurialPointData } from "../../store/burialPoint"; import { getBurialPointData } from "../../store/burialPoint";
import useBurialPointStore from "../../store/burialPoint"; import useBurialPointStore from "../../store/burialPoint";
import AsyncStorage from "@react-native-async-storage/async-storage"; import AsyncStorage from "@react-native-async-storage/async-storage";
import { getCountryTransLanguage } from "../../utils/languageUtils";
// 定义本地存储的国家数据类型 // 定义本地存储的国家数据类型
interface LocalCountryData { interface LocalCountryData {
code: string; code: string;
flag: string; flag: string;
country: number;
name: string; name: string;
phoneCode: string; phoneCode: string;
userCount: number; userCount: number;
@ -302,8 +304,8 @@ export const PreviewOrder = () => {
// 获取显示的国家代码 // 获取显示的国家代码
const getDisplayCountryCode = () => { const getDisplayCountryCode = () => {
if (loadingCountries) return "..."; if (loadingCountries) return "...";
if (localSelectedCountry?.phoneCode) { if (localSelectedCountry?.country) {
return localSelectedCountry.phoneCode; return localSelectedCountry.country;
} }
if (selectedCountry?.country) { if (selectedCountry?.country) {
return `+${selectedCountry.country}`; return `+${selectedCountry.country}`;
@ -573,7 +575,7 @@ export const PreviewOrder = () => {
styles.selectedCountryItemText, styles.selectedCountryItemText,
]} ]}
> >
{item.name_en} (+{item.country}) {getCountryTransLanguage(item)} (+{item.country})
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
)} )}

9
app/screens/productStatus/OrderDatails.tsx

@ -55,7 +55,7 @@ import IconComponent from "../../components/IconComponent";
import AsyncStorage from "@react-native-async-storage/async-storage"; import AsyncStorage from "@react-native-async-storage/async-storage";
import { CountryList } from "../../constants/countries"; import { CountryList } from "../../constants/countries";
import { getOrderTransLanguage,getAttributeTransLanguage,getAttributeNameTransLanguage } from "../../utils/languageUtils"; import { getOrderTransLanguage,getAttributeTransLanguage,getAttributeNameTransLanguage } from "../../utils/languageUtils";
import { getCountryTransLanguage } from "../../utils/languageUtils";
// 定义选项类型 // 定义选项类型
interface PaymentOption { interface PaymentOption {
@ -76,6 +76,7 @@ interface LocalCountryData {
code: string; code: string;
flag: string; flag: string;
name: string; name: string;
country: number | string;
phoneCode: string; phoneCode: string;
userCount: number; userCount: number;
} }
@ -366,8 +367,8 @@ export const OrderDetails = () => {
// 获取显示的国家代码 // 获取显示的国家代码
const getDisplayCountryCode = () => { const getDisplayCountryCode = () => {
if (loadingCountries) return "..."; if (loadingCountries) return "...";
if (localSelectedCountry?.phoneCode) { if (localSelectedCountry?.country) {
return localSelectedCountry.phoneCode; return String(localSelectedCountry.country);
} }
if (selectedCountry?.country) { if (selectedCountry?.country) {
return `+${selectedCountry.country}`; return `+${selectedCountry.country}`;
@ -1719,7 +1720,7 @@ export const OrderDetails = () => {
styles.currencyButtonTextActive, styles.currencyButtonTextActive,
]} ]}
> >
{item.name_en} (+{item.country}) {getCountryTransLanguage(item)} (+{item.country})
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
)} )}

133
app/utils/languageUtils.ts

@ -1,146 +1,157 @@
import { getCurrentLanguage } from '../i18n'; import { getCurrentLanguage } from "../i18n";
export const getSubjectTransLanguage = <T extends Record<string, any>>(data: T): string => { export const getSubjectTransLanguage = <T extends Record<string, any>>(
data: T
): string => {
// 获取当前i18n语言 // 获取当前i18n语言
const currentLang = getCurrentLanguage(); const currentLang = getCurrentLanguage();
console.log('currentLang', currentLang); console.log("currentLang", currentLang);
// 特殊处理中文 // 特殊处理中文
if (currentLang === 'zh' && 'subject' in data) { if (currentLang === "zh" && "subject" in data) {
return data.subject as string; return data.subject as string;
} }
// 获取所有subject_trans开头的字段 // 获取所有subject_trans开头的字段
const translationFields = Object.keys(data).filter(key => const translationFields = Object.keys(data).filter((key) =>
key.startsWith('subject_trans') key.startsWith("subject_trans")
); );
// 查找匹配的字段 // 查找匹配的字段
const matchedField = translationFields.find(field => { const matchedField = translationFields.find((field) => {
// 从字段名中提取语言代码 // 从字段名中提取语言代码
const langCode = field.replace('subject_trans_', ''); const langCode = field.replace("subject_trans_", "");
// 如果没有后缀,则为法语 // 如果没有后缀,则为法语
return langCode === '' ? currentLang === 'fr' : langCode === currentLang; return langCode === "" ? currentLang === "fr" : langCode === currentLang;
}); });
// 返回匹配的翻译值,如果没有匹配则返回法语 // 返回匹配的翻译值,如果没有匹配则返回法语
return (data[matchedField || 'subject_trans'] as string) || ''; return (data[matchedField || "subject_trans"] as string) || "";
}; };
export const getAttributeTransLanguage = <T extends Record<string, any>>(
data: T
export const getAttributeTransLanguage = <T extends Record<string, any>>(data: T): string => { ): string => {
// 获取当前i18n语言 // 获取当前i18n语言
const currentLang = getCurrentLanguage(); const currentLang = getCurrentLanguage();
// 特殊处理中文 // 特殊处理中文
if (currentLang === 'zh' && 'value' in data) { if (currentLang === "zh" && "value" in data) {
return data.value as string; return data.value as string;
} }
// 获取所有value_trans开头的字段 // 获取所有value_trans开头的字段
const translationFields = Object.keys(data).filter(key => const translationFields = Object.keys(data).filter((key) =>
key.startsWith('value_trans') key.startsWith("value_trans")
); );
// 查找匹配的字段 // 查找匹配的字段
const matchedField = translationFields.find(field => { const matchedField = translationFields.find((field) => {
// 从字段名中提取语言代码 // 从字段名中提取语言代码
const langCode = field.replace('value_trans_', ''); const langCode = field.replace("value_trans_", "");
// 如果没有后缀,则为法语 // 如果没有后缀,则为法语
return langCode === '' ? currentLang === 'fr' : langCode === currentLang; return langCode === "" ? currentLang === "fr" : langCode === currentLang;
}); });
// 返回匹配的翻译值,如果没有匹配则返回法语 // 返回匹配的翻译值,如果没有匹配则返回法语
return (data[matchedField || 'value_trans'] as string) || ''; return (data[matchedField || "value_trans"] as string) || "";
}; };
export const getAttributeNameTransLanguage = <T extends Record<string, any>>(
export const getAttributeNameTransLanguage = <T extends Record<string, any>>(data: T): string => { data: T
): string => {
// 获取当前i18n语言 // 获取当前i18n语言
const currentLang = getCurrentLanguage(); const currentLang = getCurrentLanguage();
// 特殊处理中文 // 特殊处理中文
if (currentLang === 'zh' && 'attribute_name' in data) { if (currentLang === "zh" && "attribute_name" in data) {
return data.attribute_name as string; return data.attribute_name as string;
} }
// 获取所有attribute_name_trans开头的字段 // 获取所有attribute_name_trans开头的字段
const translationFields = Object.keys(data).filter(key => const translationFields = Object.keys(data).filter((key) =>
key.startsWith('attribute_name_trans') key.startsWith("attribute_name_trans")
); );
// 查找匹配的字段 // 查找匹配的字段
const matchedField = translationFields.find(field => { const matchedField = translationFields.find((field) => {
// 从字段名中提取语言代码 // 从字段名中提取语言代码
const langCode = field.replace('attribute_name_trans_', ''); const langCode = field.replace("attribute_name_trans_", "");
// 如果没有后缀,则为法语 // 如果没有后缀,则为法语
return langCode === '' ? currentLang === 'fr' : langCode === currentLang; return langCode === "" ? currentLang === "fr" : langCode === currentLang;
}); });
// 返回匹配的翻译值,如果没有匹配则返回法语 // 返回匹配的翻译值,如果没有匹配则返回法语
return (data[matchedField || 'attribute_name_trans'] as string) || ''; return (data[matchedField || "attribute_name_trans"] as string) || "";
} };
export const getSkuTransLanguage = <T extends Record<string, any>>(data: T): string => { export const getSkuTransLanguage = <T extends Record<string, any>>(
data: T
): string => {
// 获取当前i18n语言 // 获取当前i18n语言
const currentLang = getCurrentLanguage(); const currentLang = getCurrentLanguage();
// 特殊处理中文 // 特殊处理中文
if (currentLang === 'zh' && 'value' in data) { if (currentLang === "zh" && "value" in data) {
return data.value as string; return data.value as string;
} }
// 获取所有subject_trans开头的字段 // 获取所有subject_trans开头的字段
const translationFields = Object.keys(data).filter(key => const translationFields = Object.keys(data).filter((key) =>
key.startsWith('value_trans') key.startsWith("value_trans")
); );
// 查找匹配的字段 // 查找匹配的字段
const matchedField = translationFields.find(field => { const matchedField = translationFields.find((field) => {
// 从字段名中提取语言代码 // 从字段名中提取语言代码
const langCode = field.replace('value_trans_', ''); const langCode = field.replace("value_trans_", "");
// 如果没有后缀,则为法语 // 如果没有后缀,则为法语
return langCode === '' ? currentLang === 'fr' : langCode === currentLang; return langCode === "" ? currentLang === "fr" : langCode === currentLang;
}); });
// 返回匹配的翻译值,如果没有匹配则返回法语 // 返回匹配的翻译值,如果没有匹配则返回法语
return (data[matchedField || 'value_trans'] as string) || ''; return (data[matchedField || "value_trans"] as string) || "";
}; };
export const getOrderTransLanguage = <T extends Record<string, any>>(
data: T
export const getOrderTransLanguage = <T extends Record<string, any>>(data: T): string => { ): string => {
console.log(data); console.log(data);
// 获取当前i18n语言 // 获取当前i18n语言
const currentLang = getCurrentLanguage(); const currentLang = getCurrentLanguage();
// 特殊处理中文 // 特殊处理中文
if (currentLang === 'zh' && 'value' in data) { if (currentLang === "zh" && "value" in data) {
return data.value as string; return data.value as string;
} }
// 获取所有subject_trans开头的字段 // 获取所有subject_trans开头的字段
const translationFields = Object.keys(data).filter(key => const translationFields = Object.keys(data).filter((key) =>
key.startsWith('product_name') key.startsWith("product_name")
); );
// 查找匹配的字段 // 查找匹配的字段
const matchedField = translationFields.find(field => { const matchedField = translationFields.find((field) => {
// 从字段名中提取语言代码 // 从字段名中提取语言代码
const langCode = field.replace('product_name_', ''); const langCode = field.replace("product_name_", "");
// 如果没有后缀,则为法语 // 如果没有后缀,则为法语
return langCode === '' ? currentLang === 'fr' : langCode === currentLang; return langCode === "" ? currentLang === "fr" : langCode === currentLang;
}); });
// 返回匹配的翻译值,如果没有匹配则返回法语 // 返回匹配的翻译值,如果没有匹配则返回法语
return (data[matchedField || 'product_name_fr'] as string) || ''; return (data[matchedField || "product_name_fr"] as string) || "";
};
// 国家的字段
export const getCountryTransLanguage = <T extends Record<string, any>>(
data: T
): string => {
const currentLang = getCurrentLanguage();
if (currentLang === "fr") {
return data.name as string;
} else {
return data.name_en as string;
}
}; };

Loading…
Cancel
Save