GDYTranslateTool.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. //
  2. // GDYTranslateTool.m
  3. // iphoneLive
  4. //
  5. // Created by YB007 on 2022/4/8.
  6. // Copyright © 2022 cat. All rights reserved.
  7. //
  8. #import "GDYTranslateTool.h"
  9. @implementation GDYTranslateTool
  10. // 接口语言标识
  11. +(NSString *)serviceLang;{
  12. if ([lagType isEqual:ZH_CN]) {
  13. return @"zh-cn";
  14. }
  15. return @"en";
  16. }
  17. /// 是否包含中文
  18. +(BOOL)isChinese:(NSString *)str{
  19. for(int i=0; i< [str length];i++){
  20. int a = [str characterAtIndex:i];
  21. if( a > 0x4E00 && a < 0x9FFF){
  22. return YES;
  23. }
  24. }
  25. return NO;
  26. }
  27. /// 纯数字
  28. +(BOOL)isPureNumandCharacters:(NSString *)string{
  29. string = [string stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
  30. if(string.length > 0) {
  31. return NO;
  32. }
  33. return YES;
  34. }
  35. /// 是否包含英文字符
  36. +(BOOL)isContainedEn:(NSString *)str {
  37. NSRegularExpression *numberRegular = [NSRegularExpression regularExpressionWithPattern:@"[A-Za-z]" options:NSRegularExpressionCaseInsensitive error:nil];
  38. NSInteger count = [numberRegular numberOfMatchesInString:str options:NSMatchingReportProgress range:NSMakeRange(0, str.length)];
  39. //count是str中包含[A-Za-z]数字的个数,只要count>0,说明str中包含数字
  40. if (count > 0) {
  41. return YES;
  42. }
  43. return NO;
  44. }
  45. /// 纯标点
  46. -(BOOL)isAllCharacterString:(NSString *)string{
  47. NSString *regex = @"[~`!@#$%^&*()_+-=[]|{};':\",./<>?]{,}/";//规定的特殊字符,可以自己随意添加
  48. //计算字符串长度
  49. NSInteger str_length = [string length];
  50. NSInteger allIndex = 0;
  51. for (int i = 0; i<str_length; i++) {
  52. //取出i
  53. NSString *subStr = [string substringWithRange:NSMakeRange(i, 1)];
  54. if([regex rangeOfString:subStr].location != NSNotFound){ //存在
  55. allIndex++;
  56. }
  57. }
  58. if (str_length == allIndex) {
  59. //纯特殊字符
  60. return YES;
  61. }else {
  62. //非纯特殊字符
  63. return NO;
  64. }
  65. }
  66. // 是否展示翻译按钮
  67. +(BOOL)judgeShowTranslateBtn:(NSString *)originStr; {
  68. return NO;
  69. originStr = [self delEmojiWithOriginStr:originStr];
  70. /// 空字符-不显示
  71. NSString *delStr = [originStr stringByReplacingOccurrencesOfString:@" " withString:@""];
  72. if (delStr.length<=0 || [PublicObj checkNull:delStr]) {
  73. return NO;
  74. }
  75. /// 纯数字-不显示
  76. if ([self isPureNumandCharacters:originStr]) {
  77. return NO;
  78. }
  79. BOOL isChi = [self isChinese:originStr];
  80. BOOL isEn = [self isContainedEn:originStr];
  81. if ([lagType isEqual:EN]) {
  82. return isChi;
  83. }else{
  84. return isEn;
  85. }
  86. }
  87. +(void)requestTranslateToken {
  88. NSString *baseUrl = @"https://aip.baidubce.com/oauth/2.0/token";
  89. NSDictionary *pullDic = @{
  90. @"grant_type":@"client_credentials",
  91. @"client_id":TransApiKey,
  92. @"client_secret":TransSecret,
  93. };
  94. //baseUrl = [baseUrl stringByAppendingFormat:@"%@",[self dealWithParam:pullDic]];
  95. baseUrl = [baseUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  96. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];
  97. [request setHTTPMethod:@"POST"];
  98. //把字典中的参数进行拼接
  99. NSString *body = [self dealWithParam:pullDic];
  100. NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
  101. //设置请求体
  102. [request setHTTPBody:bodyData];
  103. //设置本次请求的数据请求格式
  104. [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  105. // 设置本次请求请求体的长度(因为服务器会根据你这个设定的长度去解析你的请求体中的参数内容)
  106. [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)bodyData.length] forHTTPHeaderField:@"Content-Length"];
  107. //设置请求最长时间
  108. request.timeoutInterval = 15;
  109. NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  110. if (data) {
  111. //利用iOS自带原生JSON解析data数据 保存为Dictionary
  112. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  113. NSLog(@"=======dic:%@",dict);
  114. if ([dict valueForKey:@"access_token"]) {
  115. [GDYTranslateTool saveAccesToken:[dict valueForKey:@"access_token"]];
  116. }else{
  117. [GDYTranslateTool saveAccesToken:@""];
  118. }
  119. }else{
  120. [GDYTranslateTool saveAccesToken:@""];
  121. }
  122. }];
  123. [task resume];
  124. }
  125. // 翻译
  126. +(void)requestTranslateWithStr:(NSString *)originStr complete:(TranslateBlock)translate;{
  127. originStr = [self delEmojiWithOriginStr:originStr];
  128. NSString *accessToken = [self getAccesToken];
  129. NSString *gdy_from = @"zh";
  130. NSString *gdy_to = @"en";
  131. if ([lagType isEqual:ZH_CN]) {
  132. gdy_from = @"en";
  133. gdy_to = @"zh";
  134. }
  135. NSString *baseUrl = [NSString stringWithFormat:@"https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=%@",accessToken];
  136. NSDictionary *pullDic = @{
  137. @"from":gdy_from,
  138. @"to":gdy_to,
  139. @"q":originStr,
  140. };
  141. //baseUrl = [baseUrl stringByAppendingFormat:@"%@",[self dealWithParam:pullDic]];
  142. baseUrl = [baseUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  143. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseUrl]];
  144. [request setHTTPMethod:@"POST"];
  145. //把字典中的参数进行拼接
  146. /*
  147. NSString *body = [self dealWithParam:pullDic];
  148. NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
  149. */
  150. NSData* bodyData =[NSJSONSerialization dataWithJSONObject:pullDic options:NSJSONWritingPrettyPrinted error:nil];
  151. //设置请求体
  152. [request setHTTPBody:bodyData];
  153. //设置本次请求的数据请求格式
  154. [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  155. // 设置本次请求请求体的长度(因为服务器会根据你这个设定的长度去解析你的请求体中的参数内容)
  156. [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)bodyData.length] forHTTPHeaderField:@"Content-Length"];
  157. //设置请求最长时间
  158. request.timeoutInterval = 15;
  159. NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  160. if (data) {
  161. //利用iOS自带原生JSON解析data数据 保存为Dictionary
  162. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  163. NSLog(@"fy=======dic:%@",dict);
  164. if ([dict valueForKey:@"error_msg"]) {
  165. NSString *eStr = [NSString stringWithFormat:@"%@-%@",[dict valueForKey:@"error_code"],[dict valueForKey:@"error_msg"]];
  166. if (translate) {
  167. translate(NO,eStr);
  168. }
  169. }else{
  170. NSDictionary *rstDic = [dict valueForKey:@"result"];
  171. NSDictionary *transDic = [[rstDic valueForKey:@"trans_result"] firstObject];
  172. NSString *transRs = minstr([transDic valueForKey:@"dst"]);
  173. if (translate) {
  174. translate(YES,transRs);
  175. }
  176. }
  177. }else{
  178. if (translate) {
  179. translate(NO,@"translate internal error");
  180. }
  181. }
  182. }];
  183. [task resume];
  184. }
  185. #pragma mark -- 拼接参数
  186. +(NSString *)dealWithParam:(NSDictionary *)param {
  187. NSArray *allkeys = [param allKeys];
  188. NSMutableString *result = [NSMutableString string];
  189. for (NSString *key in allkeys) {
  190. NSString *string = [NSString stringWithFormat:@"%@=%@&", key, param[key]];
  191. [result appendString:string];
  192. }
  193. NSString *newStr = [result substringToIndex:(result.length-1)];
  194. return newStr;
  195. }
  196. +(void)saveAccesToken:(NSString *)save{
  197. NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
  198. [userDef setObject:save forKey:@"gdy_bd_access_token"];
  199. [userDef synchronize];
  200. }
  201. +(NSString *)getAccesToken{
  202. NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
  203. NSString *getVal = [userDef objectForKey:@"gdy_bd_access_token"];
  204. return getVal;
  205. }
  206. #pragma mark - 将表情踢出
  207. +(NSString *)delEmojiWithOriginStr:(NSString *)originStr{
  208. //匹配表情文字
  209. NSArray *resultArr = [PublicObj machesWithPattern:emojiPattern andStr:originStr];
  210. if (!resultArr){
  211. return originStr;
  212. }
  213. NSUInteger lengthDetail = 0;
  214. NSMutableAttributedString *attstr = [[NSMutableAttributedString alloc]initWithString:originStr];
  215. //NSLog(@"del ======>\n%@",attstr);
  216. //遍历所有的result 取出range
  217. for (NSTextCheckingResult *result in resultArr) {
  218. //取出图片名
  219. NSString *imageName = [originStr substringWithRange:NSMakeRange(result.range.location, result.range.length)];
  220. //NSLog(@"--------%@",imageName);
  221. /*
  222. NSTextAttachment *attach = [[NSTextAttachment alloc] init];
  223. UIImage *emojiImage = [UIImage imageNamed:imageName];
  224. NSAttributedString *imageString;
  225. if (emojiImage) {
  226. attach.image = emojiImage;
  227. attach.bounds = CGRectMake(0, -2, 15, 15);
  228. imageString = [NSAttributedString attributedStringWithAttachment:attach];
  229. }else{
  230. imageString = [[NSMutableAttributedString alloc]initWithString:imageName];
  231. }
  232. */
  233. NSAttributedString *imageString = [[NSMutableAttributedString alloc]initWithString:@""];
  234. //图片附件的文本长度是1
  235. //NSLog(@"emoj===%zd===size-w:%f==size-h:%f",imageString.length,imageString.size.width,imageString.size.height);
  236. NSUInteger length = attstr.length;
  237. NSRange newRange = NSMakeRange(result.range.location - lengthDetail, result.range.length);
  238. [attstr replaceCharactersInRange:newRange withAttributedString:imageString];
  239. lengthDetail += length - attstr.length;
  240. }
  241. NSString *newStr = [attstr string];
  242. //NSLog(@"del emoji\n原:%@\n新:%@\n富:%@\n长:%lu",originStr,newStr,attstr,(unsigned long)attstr.length);
  243. return newStr;
  244. }
  245. @end