Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Tooling] Migrate iOS13 Widgets to use App strings #17630

Merged
merged 6 commits into from
Dec 8, 2021

Conversation

AliSoftware
Copy link
Contributor

@AliSoftware AliSoftware commented Dec 6, 2021

This is part of project ref paaHJt-2Ib-p2 & paaHJt-2J8-p2

This PR is a follow-up of #17570 and migrates the 3 iOS13-styte widgets (the legacy ones that since got kinda obsoleted by our more modern WordPressStatsWidgets migrated in #17570 but are still relevant to people who didn't update yet)

What went into this PR

  • I moved the AppLocalizedString.swift file to a more appropriate, shared directory as it is now used by multiple targets (not just the WordPressStatsWidgets from when this was introduced back in Merge 18.7.0.1 (beta 2) into develop #17562)
  • I then added it to all the WordPress*Widget targets, as well as to the main WordPress and Jetpack app targets (since some files using this from next step were included in both the *Widget and the app targets).
  • I went over every file(†) which were used by those WordPress*Widget targets (i.e. were part of their Compile Sources Build Phase) and for each replaced every use of NSLocalizedString with AppLocalizedString, to ensure they always look up strings from the app's bundle, even in the context of an App Extension / Widget
  • Removed all the *.lproj/Localizable.strings files from the various *Widget targets

(†) To ensure I didn't miss any of the files included in those targets' Build Phase, including the files that were not located under WordPress/WordPress*Widget/** but also files that lived in WordPress/Classes/** as they were shared by the app too, I wrote some scripts as below:

files_in_targets.rb
#!/usr/bin/env ruby

require 'xcodeproj'

def die!(error)
  puts error
  exit 1
end

def list(array)
  array.map { |x| " - #{x}" }.join("\n")
end

die! 'Name of a target is required as first parameter.' if ARGV.count == 0
targets_to_check = ARGV

project = Xcodeproj::Project.open('WordPress/WordPress.xcodeproj')
targets = targets_to_check.map do |name|
  project.targets.find { |t| t.name == name } \
    or die! "Can't find target #{name}. Available targets are:\n#{list(project.targets.map(&:name))}."
end

phases = targets.map do |t|
  t.build_phases.find { |p| p.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase) } \
    or die! "The target #{target} does not seem to have a Sources Build Phase."
end

files = phases.flat_map { |p| p.files_references.map(&:real_path) }.sort.uniq

# puts "Files compiled as part of targets #{targets_to_check.inspect}:"
# puts list(files.map(&:to_s))
print files.join("\0")
Running the script

I then ran the above script to list all the files that were in any of the Widget targets, and pipe it to ag via xargs to search for any use of NSLocalizedString. I then replaced all the relevant occurrences found by AppLocalizedString instead, and this is what was left at the end of this PR (aka only occurrences in comments), showing that everything from Widgets should be migrated.

$ ruby ./files_in_target.rb WordPressStatsWidgets WordPressTodayWidget WordPressThisWeekWidget WordPressAllTimeWidget | xargs -0 ag 'NSLocalizedString'

/Users/olivier/Documents/Dev/apps/WordPress-iOS/WordPress/Classes/Utility/AppLocalizedString.swift
28:/// and its value to have been provided via a call to `NSLocalizedString` or `AppLocalizedString`.
32:/// at that point of the code, via a call to `NSLocalizedString`, `AppLocalizedString` or similar upstream in the code.
37:/// Use this function instead of `NSLocalizedString` to reference localized strings **from the app bundle** – especially
40:/// You should use this `AppLocalizedString` method in place of `NSLocalizedString` especially when calling it

/Users/olivier/Documents/Dev/apps/WordPress-iOS/WordPress/Classes/ViewRelated/Stats/Extensions/Double+Stats.swift
45:                    // Note: using `AppLocalizedString` here (instead of `NSLocalizedString`) to ensure that strings

How to Test

The steps to test are pretty similar to the ones from #17570:

  1. Select one of the iOS13 widget scheme (WordPressTodayWidget, WordPressThisWeekWidget, WordPressAllTimeWidget)
  2. Select "Clean Build Folder" in Xcode (to ensure there's no .strings resources cached in previous build folders)
  3. Edit the Scheme, and under Run > Options tab, choose an App Language and App Region in the dropdown you want to test this in
  4. Open the iOS simulator you plan to test that PR in, or your test device, and delete any instance of WordPress installed in it (to ensure any cached precompiled resources installed would not remain and muddy the test)
  5. Optionally, change the device language in that simulator to the locale to test (Settings app > General > Language).
    • In theory this is redundant with the setting you just set in the Xcode Scheme under Run > Options, but in practice I've seen cases where the Language in Scheme settings was not always taken into account for widgets themselves? 🤷 So better safe than sorry.
  6. Back to Xcode, Build and Run the iOS13 Widget scheme you previously chose.
    • The simulator should end up launching on the leftmost page of the Springboard where iOS13-style widgets live, and you should have the 3 iOS13 widgets displayed there.
    • If not, it might be worth retrying a ⌘R (and pray). I've had many hit-and-miss there (debugging iOS13 Widgets is not a great Xcode experience), YMMV. Insulting Xcode doesn't seem to improve the results, but switching to another model of simulator might (e.g. iPhone 11 Pro iOS 13.5 often led me in "Unable to load widget" error, but then switching to iPhone 11 Pro iOS 15 finally worked… 🤷 ).
    • It might also help (?) to clean, then ⌘R once (which might land in an empty Springboard page without the widgets), then open the newly installed WordPress app once and maybe even log in and go to the Stats screen in the app, then go back to Xcode and start a ⌘R again…
  7. Check that the various strings – especially the "Visitors", "Views", "Comments", "Likes" keys which were previously already translated in most locales – appear in the language you are testing in.
    • Also check that the dates on the "This Week" widget are formatted according to your Region settings
    • It could happen that some strings don't have a translation in all locales; in that case it might be worth checking that it's falling back to English as expected. Though in practice now that translations are all pulled from the app bundle's .strings – which contains way more translations than the previous .strings files that this PR deleted from the widget target – it is more likely that we'll have more translation coverage for free, so I expect that all of "Views" ,"Visitors", "Posts", "Best views ever", "Likes", "Comments" and "Today" have translations in all our Mag16 (while e.g. "Best views ever" was not part of the widget target's .strings file before and thus likely did not show up as localized in most locales prior to this PR, but now does)

Note on Widgets' titles

Note that the names/titles of the 3 iOS13 widgets (which appear in each widget's "title bar") won't be translated. This is because if I'm not mistaken, those titles come from each widget target's Info.plist and its CFBundleDisplayName key, so to have those translated we'd need to provide a localized title via an InfoPlist.strings file for each.

Given those targets are legacy (obsoleted by the new iOS14+'s WordPressStatsWidgets), I didn't feel it worth it to put in place a complicated logic to handle the case for those titles – which would require a fastlane action to redispatch the translated strings from GlotPress into those .strings files on download, action which I only plan to work on later in the project anyway. So I decided to keep the status quo here and consider that not having those legacy widget's titles localized was acceptable given their obsolescence.

Regression Notes

  1. Potential unintended areas of impact

Localization of iOS13 widgets

  1. What I did to test those areas of impact (or what existing automated tests I relied on)

Tested in simulator in a couple of locales

  1. What automated tests I added (or what prevented me from doing so)

N/A


PR submission checklist:

  • I have completed the Regression Notes.
  • I have considered adding unit tests for my changes.
  • I have considered adding accessibility improvements for my changes.
  • I have considered if this change warrants user-facing release notes and have added them to RELEASE-NOTES.txt if necessary.

This file was previously in the directory associated with the `WordPressStatsWidgets` target.

But now that I plan to use this helper for other App Extension / Widget targets, it seems better suited to move it under `WordPress/Utility`.
For now this commit only moves it around, next commits will add that file to more targets and start using it elsewhere.
 - WordPressTodayWidget
 - WordPressThisWeekWidget
 - WordPressAllTimeWidget
 - WordPress & Jetpack app targets (†)

(†) as some files where I'll need to use `AppLocalizedString` instead of `NSLocalizedString` are used by app extensions… but also used with the app targets too (especially views related to Stats)
This file is used not only by the app, but is also build as part of the various Widget targets

Note: searching each swift file that is built as part of by `WordPressStatsWidgets` (iOS14) for their use of `NSLocalizedString` revealed that this was the only one which we missed during transition of the WordPressStatsWidgets target previously.

Other widget targets have more files which need the same transition, those will be done in a subsequent commit.
@AliSoftware AliSoftware added the Tooling Build, Release, and Validation Tools label Dec 6, 2021
@AliSoftware AliSoftware added this to the 18.9 milestone Dec 6, 2021
@AliSoftware AliSoftware self-assigned this Dec 6, 2021
@peril-wordpress-mobile
Copy link

peril-wordpress-mobile bot commented Dec 6, 2021

You can trigger an installable build for these changes by visiting CircleCI here.

@AliSoftware AliSoftware requested a review from a team December 6, 2021 20:33
@peril-wordpress-mobile
Copy link

peril-wordpress-mobile bot commented Dec 7, 2021

You can trigger optional UI/connected tests for these changes by visiting CircleCI here.

Copy link
Contributor

@mokagio mokagio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posting the code-only review before starting the manual testing, which might take a while and end up being interrupted by dinner time 😅

So far, looks great. I'm not a fan of sharing files between targets, but I think this is the best solution in the current state of the codebase and likely to remain viable and effective for a while 👍

WordPress/Classes/Utility/AppLocalizedString.swift Outdated Show resolved Hide resolved
WordPress/Classes/Utility/AppLocalizedString.swift Outdated Show resolved Hide resolved
h/t @mokagio for spotting them

Co-authored-by: Gio Lodi <[email protected]>
@mokagio
Copy link
Contributor

mokagio commented Dec 7, 2021

I'm not having any luck loading the widgets... I tried different Simulators and two different schemes (Today and ThisWeek) and iOS 13.x vs 15 versions.

I just don't see them in the list or the Widgets springboard page. E.g.:

Screen Shot 2021-12-07 at 6 04 44 pm

Screen Shot 2021-12-07 at 6 04 15 pm

Anything I might be missing? Suggestions?


As I was writing this comment, macOS informed me SpringBoard crashed 🤦

@AliSoftware
Copy link
Contributor Author

I'm not having any luck loading the widgets... I tried different Simulators and two different schemes (Today and ThisWeek) and iOS 13.x vs 15 versions.

As I was writing this comment, macOS informed me SpringBoard crashed 🤦

Welcome to my world 😒

Last resort I tried was rebooting the Mac. Another alternative worth trying is… testing on device?

@AliSoftware
Copy link
Contributor Author

AliSoftware commented Dec 7, 2021

Anything I might be missing? Suggestions?

Other tricks I tried: once the scheme for the widget got launched, try to go to the other pages of the Springboard to locate the WordPress app itself (which got installed alongside the widgets), launch it at least once, and then go back to Xcode and retry a ⌘R (without a clean beforehand this time!).

Last alternative: test on device (or reboot Mac and sacrifice a goat before retrying)

I'm re-adding @wordpress-mobile/owl-team as reviewers (instead of just you) in case others 🦉 have more luck testing in their own Xcode and Simulators… 🤞 (even those those issues matches my poor and very random experience with Xcode and debugging Widgets 😒 but let's hope one of you will be able to finally have Xcode on their side at least once…)

@mokagio
Copy link
Contributor

mokagio commented Dec 8, 2021

I was finally able to get this to run, on an iPad Pro 12.9" 4th Generation with iOS 13.4 Simulator 😓

But... I don't get the localized strings. I tried Italian, Spanish, and French.

Italian Spanish French
Screen Shot 2021-12-08 at 6 18 31 am image image

At this point, though, I'm not too confident in Xcode and the Simulator accuracy...

I thought about shipping an installable build but I don't have a device with iOS 13 at hand. 🤔 I say let's just merge it and see how we go.

@AliSoftware
Copy link
Contributor Author

Debugging TodayWidget while my simulator is in French, and this is indeed super strange:

(lldb) po Bundle.app
NSBundle </Users/olivier/Library/Developer/CoreSimulator/Devices/9BC9C23C-FCFA-41B5-9BBC-5B19D47F3D52/data/Containers/Bundle/Application/6C9EC4A4-87D1-4CFE-BF97-766CB28E00BF/WordPress.app> (not yet loaded)

(lldb) po Bundle.app.preferredLocalizations
▿ 1 element
  - 0 : "en"

(lldb) po Locale.preferredLanguages
▿ 2 elements
  - 0 : "fr-FR"
  - 1 : "en-FR"

(lldb) po Bundle.app.localizedString(forKey: "Views", value: "Nope", table: nil)
"Views"

(lldb) expr let $fr = NSDictionary(contentsOf: Bundle.app.url(forResource: "Localizable", withExtension: "strings", subdirectory: nil, localization: "fr")!)!
(lldb) po $fr["Views"]
▿ Optional<Any>
  - some : Vues

(lldb) po LocalizedText.views
"Views"

(lldb) po LocalizedText.likes
"Likes"

(lldb) po $fr["Likes"]
▿ Optional<Any>
  - some : J’aime
Screenshot of Debugging Session on WordPressTodayWidget extension target

So… I'm just hoping it's because of Xcode and the simulator not being great for that and that it would work as expected on a real device 🤞

@AliSoftware
Copy link
Contributor Author

AliSoftware commented Dec 8, 2021

I say let's just merge it and see how we go.

Yeah I agree 👍
Especially given those are legacy anyway and superseded by the StatsWidget, and that Xcode seems to behave equally badly when trying to test those Widgets in various locales before the changes in this PR too.

@mokagio Can I get an official ✅ on the PR so it can be merged? 🙇

@AliSoftware AliSoftware enabled auto-merge December 8, 2021 17:19
Copy link
Contributor

@mokagio mokagio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explicit approval based on conversation above 👍

@AliSoftware AliSoftware merged commit 82d6fd1 into develop Dec 8, 2021
@AliSoftware AliSoftware deleted the tooling/l10n-step2/ios13-widgets branch December 8, 2021 17:48
mokagio added a commit that referenced this pull request Dec 9, 2021
Got a bunch of conflicts because of deleted files on `develop` that this
branch modified, most were localizations because of
#17630 and
#17636.

There was also a conflict on the change in the timeout duration of a
test, which I solved by keeping the longest timeout value.

I ensured the app built and the tests passed before committing 👌

Full list of conflicting files:

- `WordPress/Classes/ViewRelated/Me/App Settings/About/AboutHeaderView.swift`
- `WordPress/Classes/ViewRelated/Me/App Settings/About/AutomatticAboutScreen.swift`
- `WordPress/Classes/ViewRelated/Me/App Settings/About/AutomatticAppLogosCell.swift`
- `WordPress/WordPressShareExtension/ar.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/bg.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/cs.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/cy.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/da.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/de.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/en-AU.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/en-CA.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/en-GB.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/es.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/fr.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/he.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/hr.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/hu.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/id.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/is.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/it.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/ja.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/ko.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/nb.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/nl.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/pl.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/pt-BR.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/pt.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/ro.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/ru.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/sk.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/sq.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/sv.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/th.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/tr.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/zh-Hans.lproj/Localizable.strings`
- `WordPress/WordPressShareExtension/zh-Hant.lproj/Localizable.strings`
- `WordPress/WordPressTest/LikeUserHelperTests.swift`
- `WordPress/WordPressTodayWidget/ar.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/bg.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/cs.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/cy.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/da.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/de.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/en-AU.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/en-CA.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/en-GB.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/es.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/fr.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/he.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/hr.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/hu.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/id.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/is.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/it.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/ja.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/ko.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/nb.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/nl.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/pl.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/pt-BR.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/pt.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/ro.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/ru.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/sk.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/sq.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/sv.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/th.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/tr.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/zh-Hans.lproj/Localizable.strings`
- `WordPress/WordPressTodayWidget/zh-Hant.lproj/Localizable.strings`
AliSoftware added a commit that referenced this pull request Dec 17, 2021
…ng is still WIP

We are currently working on removing `update-translations.rb` + `fix-translations` + `extract-framework-translations.swift` scripts from the repo and migrating their logic into the release-toolkit, but that work is still in progress.

The role of the (misleadingly named) `extract-frameworks-translations.swift` script was to redistribute the keys from the `*.lproj/Localizable.strings` downloaded from GlotPress into the `.strings` files of the Widgets and ShareExtension targets, back when those targets used their own `.strings` file.

This is no longer the case since #17630 and #17636 landed – as Widgets and ShareExtension's code now reference the app's `.strings` file directly – which means we don't need to run the logic from `extract-frameworks-translations.swift` anymore, and in fact if we did, it would probably crash now that the `Base.lproj/Localizable.strings` files in the Widgets and ShareExtension subfolders (which that script references) don't exist anymore.
mokagio added a commit that referenced this pull request Jan 10, 2022
Conflicts in all the `*.lproj/Localizable.strings` from the
WordPressShareExtension and WordPressTodayWidget targets. The conflicts
are a byproduct of the work done in
#17630 and
#17636.

I haven't spent the time to research why Git saw those a modified on
`trunk` because, regardless, the right thing for them is to be deleted
now that the extensions fetch their strings from the main bundle.

Also got a conflict on the `ar-SA` release notes. I resolved it by
keeping the more recent version from 19.0.

Full list of conflicting files:

```
WordPress/WordPressShareExtension/ar.lproj/Localizable.strings
WordPress/WordPressShareExtension/bg.lproj/Localizable.strings
WordPress/WordPressShareExtension/cs.lproj/Localizable.strings
WordPress/WordPressShareExtension/cy.lproj/Localizable.strings
WordPress/WordPressShareExtension/da.lproj/Localizable.strings
WordPress/WordPressShareExtension/de.lproj/Localizable.strings
WordPress/WordPressShareExtension/en-AU.lproj/Localizable.strings
WordPress/WordPressShareExtension/en-CA.lproj/Localizable.strings
WordPress/WordPressShareExtension/en-GB.lproj/Localizable.strings
WordPress/WordPressShareExtension/es.lproj/Localizable.strings
WordPress/WordPressShareExtension/fr.lproj/Localizable.strings
WordPress/WordPressShareExtension/he.lproj/Localizable.strings
WordPress/WordPressShareExtension/hr.lproj/Localizable.strings
WordPress/WordPressShareExtension/hu.lproj/Localizable.strings
WordPress/WordPressShareExtension/id.lproj/Localizable.strings
WordPress/WordPressShareExtension/is.lproj/Localizable.strings
WordPress/WordPressShareExtension/it.lproj/Localizable.strings
WordPress/WordPressShareExtension/ja.lproj/Localizable.strings
WordPress/WordPressShareExtension/ko.lproj/Localizable.strings
WordPress/WordPressShareExtension/nb.lproj/Localizable.strings
WordPress/WordPressShareExtension/nl.lproj/Localizable.strings
WordPress/WordPressShareExtension/pl.lproj/Localizable.strings
WordPress/WordPressShareExtension/pt-BR.lproj/Localizable.strings
WordPress/WordPressShareExtension/pt.lproj/Localizable.strings
WordPress/WordPressShareExtension/ro.lproj/Localizable.strings
WordPress/WordPressShareExtension/ru.lproj/Localizable.strings
WordPress/WordPressShareExtension/sk.lproj/Localizable.strings
WordPress/WordPressShareExtension/sq.lproj/Localizable.strings
WordPress/WordPressShareExtension/sv.lproj/Localizable.strings
WordPress/WordPressShareExtension/th.lproj/Localizable.strings
WordPress/WordPressShareExtension/tr.lproj/Localizable.strings
WordPress/WordPressShareExtension/zh-Hans.lproj/Localizable.strings
WordPress/WordPressShareExtension/zh-Hant.lproj/Localizable.strings
WordPress/WordPressTodayWidget/ar.lproj/Localizable.strings
WordPress/WordPressTodayWidget/bg.lproj/Localizable.strings
WordPress/WordPressTodayWidget/cs.lproj/Localizable.strings
WordPress/WordPressTodayWidget/cy.lproj/Localizable.strings
WordPress/WordPressTodayWidget/da.lproj/Localizable.strings
WordPress/WordPressTodayWidget/de.lproj/Localizable.strings
WordPress/WordPressTodayWidget/en-AU.lproj/Localizable.strings
WordPress/WordPressTodayWidget/en-CA.lproj/Localizable.strings
WordPress/WordPressTodayWidget/en-GB.lproj/Localizable.strings
WordPress/WordPressTodayWidget/es.lproj/Localizable.strings
WordPress/WordPressTodayWidget/fr.lproj/Localizable.strings
WordPress/WordPressTodayWidget/he.lproj/Localizable.strings
WordPress/WordPressTodayWidget/hr.lproj/Localizable.strings
WordPress/WordPressTodayWidget/hu.lproj/Localizable.strings
WordPress/WordPressTodayWidget/id.lproj/Localizable.strings
WordPress/WordPressTodayWidget/is.lproj/Localizable.strings
WordPress/WordPressTodayWidget/it.lproj/Localizable.strings
WordPress/WordPressTodayWidget/ja.lproj/Localizable.strings
WordPress/WordPressTodayWidget/ko.lproj/Localizable.strings
WordPress/WordPressTodayWidget/nb.lproj/Localizable.strings
WordPress/WordPressTodayWidget/nl.lproj/Localizable.strings
WordPress/WordPressTodayWidget/pl.lproj/Localizable.strings
WordPress/WordPressTodayWidget/pt-BR.lproj/Localizable.strings
WordPress/WordPressTodayWidget/pt.lproj/Localizable.strings
WordPress/WordPressTodayWidget/ro.lproj/Localizable.strings
WordPress/WordPressTodayWidget/ru.lproj/Localizable.strings
WordPress/WordPressTodayWidget/sk.lproj/Localizable.strings
WordPress/WordPressTodayWidget/sq.lproj/Localizable.strings
WordPress/WordPressTodayWidget/sv.lproj/Localizable.strings
WordPress/WordPressTodayWidget/th.lproj/Localizable.strings
WordPress/WordPressTodayWidget/tr.lproj/Localizable.strings
WordPress/WordPressTodayWidget/zh-Hans.lproj/Localizable.strings
WordPress/WordPressTodayWidget/zh-Hant.lproj/Localizable.strings
fastlane/metadata/ar-SA/release_notes.txt
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Tooling Build, Release, and Validation Tools
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants