mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-24 08:20:31 +08:00
feat: get phone number and country from Google OAuth provider (#2965)
* feat: get phone number and country from Google OAuth provider * feat: fix i18n
This commit is contained in:
parent
bfcfb56336
commit
af2a9f0374
@ -25,6 +25,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/casdoor/casdoor/util"
|
"github.com/casdoor/casdoor/util"
|
||||||
|
"github.com/nyaruka/phonenumbers"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -130,6 +131,23 @@ type GoogleUserInfo struct {
|
|||||||
Locale string `json:"locale"`
|
Locale string `json:"locale"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GooglePeopleApiPhoneNumberMetaData struct {
|
||||||
|
Primary bool `json:"primary"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GooglePeopleApiPhoneNumber struct {
|
||||||
|
CanonicalForm string `json:"canonicalForm"`
|
||||||
|
MetaData GooglePeopleApiPhoneNumberMetaData `json:"metadata"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GooglePeopleApiResult struct {
|
||||||
|
PhoneNumbers []GooglePeopleApiPhoneNumber `json:"phoneNumbers"`
|
||||||
|
Etag string `json:"etag"`
|
||||||
|
ResourceName string `json:"resourceName"`
|
||||||
|
}
|
||||||
|
|
||||||
func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
|
func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
|
||||||
if strings.HasPrefix(token.AccessToken, GoogleIdTokenKey) {
|
if strings.HasPrefix(token.AccessToken, GoogleIdTokenKey) {
|
||||||
googleIdToken, ok := token.Extra(GoogleIdTokenKey).(GoogleIdToken)
|
googleIdToken, ok := token.Extra(GoogleIdTokenKey).(GoogleIdToken)
|
||||||
@ -167,12 +185,49 @@ func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error)
|
|||||||
return nil, errors.New("google email is empty")
|
return nil, errors.New("google email is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
url = fmt.Sprintf("https://people.googleapis.com/v1/people/me?personFields=phoneNumbers&access_token=%s", token.AccessToken)
|
||||||
|
resp, err = idp.Client.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, err = io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var googlePeopleResult GooglePeopleApiResult
|
||||||
|
err = json.Unmarshal(body, &googlePeopleResult)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var phoneNumber string
|
||||||
|
var countryCode string
|
||||||
|
if len(googlePeopleResult.PhoneNumbers) != 0 {
|
||||||
|
for _, phoneData := range googlePeopleResult.PhoneNumbers {
|
||||||
|
if phoneData.MetaData.Primary {
|
||||||
|
phoneNumber = phoneData.CanonicalForm
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
phoneNumberParsed, err := phonenumbers.Parse(phoneNumber, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
countryCode = phonenumbers.GetRegionCodeForNumber(phoneNumberParsed)
|
||||||
|
phoneNumber = fmt.Sprintf("%d", phoneNumberParsed.GetNationalNumber())
|
||||||
|
}
|
||||||
|
|
||||||
userInfo := UserInfo{
|
userInfo := UserInfo{
|
||||||
Id: googleUserInfo.Id,
|
Id: googleUserInfo.Id,
|
||||||
Username: googleUserInfo.Email,
|
Username: googleUserInfo.Email,
|
||||||
DisplayName: googleUserInfo.Name,
|
DisplayName: googleUserInfo.Name,
|
||||||
Email: googleUserInfo.Email,
|
Email: googleUserInfo.Email,
|
||||||
AvatarUrl: googleUserInfo.Picture,
|
AvatarUrl: googleUserInfo.Picture,
|
||||||
|
Phone: phoneNumber,
|
||||||
|
CountryCode: countryCode,
|
||||||
}
|
}
|
||||||
return &userInfo, nil
|
return &userInfo, nil
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ type Provider struct {
|
|||||||
|
|
||||||
Host string `xorm:"varchar(100)" json:"host"`
|
Host string `xorm:"varchar(100)" json:"host"`
|
||||||
Port int `json:"port"`
|
Port int `json:"port"`
|
||||||
DisableSsl bool `json:"disableSsl"` // If the provider type is WeChat, DisableSsl means EnableQRCode
|
DisableSsl bool `json:"disableSsl"` // If the provider type is WeChat, DisableSsl means EnableQRCode, if type is Google, it means sync phone number
|
||||||
Title string `xorm:"varchar(100)" json:"title"`
|
Title string `xorm:"varchar(100)" json:"title"`
|
||||||
Content string `xorm:"varchar(2000)" json:"content"` // If provider type is WeChat, Content means QRCode string by Base64 encoding
|
Content string `xorm:"varchar(2000)" json:"content"` // If provider type is WeChat, Content means QRCode string by Base64 encoding
|
||||||
Receiver string `xorm:"varchar(100)" json:"receiver"`
|
Receiver string `xorm:"varchar(100)" json:"receiver"`
|
||||||
|
@ -832,6 +832,20 @@ class ProviderEditPage extends React.Component {
|
|||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
this.state.provider.type !== "Google" ? null : (
|
||||||
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
|
{Setting.getLabel(i18next.t("provider:Get phone number"), i18next.t("provider:Get phone number - Tooltip"))} :
|
||||||
|
</Col>
|
||||||
|
<Col span={1} >
|
||||||
|
<Switch disabled={!this.state.provider.clientId} checked={this.state.provider.disableSsl} onChange={checked => {
|
||||||
|
this.updateProviderField("disableSsl", checked);
|
||||||
|
}} />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
)
|
||||||
|
}
|
||||||
{
|
{
|
||||||
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "AzureADB2C" && this.state.provider.type !== "Casdoor" && this.state.provider.type !== "Okta" ? null : (
|
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "AzureADB2C" && this.state.provider.type !== "Casdoor" && this.state.provider.type !== "Okta" ? null : (
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
|
@ -384,8 +384,7 @@ export function getAuthUrl(application, provider, method, code) {
|
|||||||
|
|
||||||
let endpoint = authInfo[provider.type].endpoint;
|
let endpoint = authInfo[provider.type].endpoint;
|
||||||
let redirectUri = `${window.location.origin}/callback`;
|
let redirectUri = `${window.location.origin}/callback`;
|
||||||
const scope = authInfo[provider.type].scope;
|
let scope = authInfo[provider.type].scope;
|
||||||
|
|
||||||
const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter");
|
const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter");
|
||||||
const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState);
|
const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState);
|
||||||
const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier"))
|
const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier"))
|
||||||
@ -396,6 +395,8 @@ export function getAuthUrl(application, provider, method, code) {
|
|||||||
}
|
}
|
||||||
} else if (provider.type === "Apple") {
|
} else if (provider.type === "Apple") {
|
||||||
redirectUri = `${window.location.origin}/api/callback`;
|
redirectUri = `${window.location.origin}/api/callback`;
|
||||||
|
} else if (provider.type === "Google" && provider.disableSsl) {
|
||||||
|
scope += "+https://www.googleapis.com/auth/user.phonenumbers.read";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (provider.type === "Google" || provider.type === "GitHub" || provider.type === "QQ" || provider.type === "Facebook"
|
if (provider.type === "Google" || provider.type === "GitHub" || provider.type === "QQ" || provider.type === "Facebook"
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name des Hosts",
|
"Host - Tooltip": "Name des Hosts",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Anfitrión",
|
"Host": "Anfitrión",
|
||||||
"Host - Tooltip": "Nombre del anfitrión",
|
"Host - Tooltip": "Nombre del anfitrión",
|
||||||
"IdP": "IdP = Proveedor de Identidad",
|
"IdP": "IdP = Proveedor de Identidad",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "L'adresse e-mail affichée comme expéditeur dans les e-mails envoyés",
|
"From address - Tooltip": "L'adresse e-mail affichée comme expéditeur dans les e-mails envoyés",
|
||||||
"From name": "Nom de l'expéditeur",
|
"From name": "Nom de l'expéditeur",
|
||||||
"From name - Tooltip": "Le nom affiché comme expéditeur dans les e-mails envoyés",
|
"From name - Tooltip": "Le nom affiché comme expéditeur dans les e-mails envoyés",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Hôte",
|
"Host": "Hôte",
|
||||||
"Host - Tooltip": "Nom d'hôte",
|
"Host - Tooltip": "Nom d'hôte",
|
||||||
"IdP": "IdP (Identité Fournisseur)",
|
"IdP": "IdP (Identité Fournisseur)",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Tuan rumah",
|
"Host": "Tuan rumah",
|
||||||
"Host - Tooltip": "Nama tuan rumah",
|
"Host - Tooltip": "Nama tuan rumah",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "ホスト",
|
"Host": "ホスト",
|
||||||
"Host - Tooltip": "ホストの名前",
|
"Host - Tooltip": "ホストの名前",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "호스트",
|
"Host": "호스트",
|
||||||
"Host - Tooltip": "호스트의 이름",
|
"Host - Tooltip": "호스트의 이름",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Endereço de e-mail do remetente",
|
"From address - Tooltip": "Endereço de e-mail do remetente",
|
||||||
"From name": "Nome do remetente",
|
"From name": "Nome do remetente",
|
||||||
"From name - Tooltip": "Nome do remetente",
|
"From name - Tooltip": "Nome do remetente",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Nome do host",
|
"Host - Tooltip": "Nome do host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Хост",
|
"Host": "Хост",
|
||||||
"Host - Tooltip": "Имя хоста",
|
"Host - Tooltip": "Имя хоста",
|
||||||
"IdP": "ИдП",
|
"IdP": "ИдП",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Email address of \"From\"",
|
"From address - Tooltip": "Email address of \"From\"",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "Name of \"From\"",
|
"From name - Tooltip": "Name of \"From\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Name of host",
|
"Host - Tooltip": "Name of host",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "Електронна адреса \"Від\"",
|
"From address - Tooltip": "Електронна адреса \"Від\"",
|
||||||
"From name": "Від імені",
|
"From name": "Від імені",
|
||||||
"From name - Tooltip": "Назва \"Від\"",
|
"From name - Tooltip": "Назва \"Від\"",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Хост",
|
"Host": "Хост",
|
||||||
"Host - Tooltip": "Ім'я хоста",
|
"Host - Tooltip": "Ім'я хоста",
|
||||||
"IdP": "IDP",
|
"IdP": "IDP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "From address - Tooltip",
|
"From address - Tooltip": "From address - Tooltip",
|
||||||
"From name": "From name",
|
"From name": "From name",
|
||||||
"From name - Tooltip": "From name - Tooltip",
|
"From name - Tooltip": "From name - Tooltip",
|
||||||
|
"Get phone number": "Get phone number",
|
||||||
|
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "Chủ nhà",
|
"Host": "Chủ nhà",
|
||||||
"Host - Tooltip": "Tên của người chủ chỗ ở",
|
"Host - Tooltip": "Tên của người chủ chỗ ở",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
|
@ -778,6 +778,8 @@
|
|||||||
"From address - Tooltip": "邮件里发件人的邮箱地址",
|
"From address - Tooltip": "邮件里发件人的邮箱地址",
|
||||||
"From name": "发件人名称",
|
"From name": "发件人名称",
|
||||||
"From name - Tooltip": "邮件里发件人的显示名称",
|
"From name - Tooltip": "邮件里发件人的显示名称",
|
||||||
|
"Get phone number": "获取手机号码",
|
||||||
|
"Get phone number - Tooltip": "如果启用获取手机号码,你需要先启用peopleApi并添加范围https://www.googleapis.com/auth/user.phonenumbers.read",
|
||||||
"Host": "主机",
|
"Host": "主机",
|
||||||
"Host - Tooltip": "主机名",
|
"Host - Tooltip": "主机名",
|
||||||
"IdP": "身份提供商",
|
"IdP": "身份提供商",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user